django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
应用场景:登录验证,session验证
因为所有的流量都需要经过中间件,所以用中间件做登录验证是非常方便的
在django项目的settings模块中,有一个 MIDDLEWARE列表,其中每一个元素就是一个中间件,如下图。
中间件的运行流程:
1、客户端发出请求(httprequest)---->
2、首先会经过中间件,,如果是None,则继续按照django定义的规则向下执行如果是HttpResonse对象,则直接将该对象返回给用户 ---->
3、在执行view、modle等模块—>
4、返回httpresonse
自建中间件:
创建一md文件夹,写入py文件:
#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time : 2019/1/4 11:18
# @Author : liaochao
# @File : middleware.py
from django.shortcuts import render,HttpResponse,redirect
#白名单
white_li = ['/login']
class MiddlewareMixin(object):
def __init__(self,get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__()
def __call__(self,request):
response=None
if hasattr(self,'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self,'process_response'):
response = self.process_response(request,response)
return response
class MiddlewareDemo1(MiddlewareMixin):
def process_request(self, request):
print('demo1_request')
def process_response(self,request,response):
print('demo1_response')
return response
class MiddlewareDemo2(MiddlewareMixin):
def process_request(self,request):
print('demo2_request')
def process_response(self,request,response):
print('demo2_response')
return response
此处demo1 和demo2写的就是中间件
注册中间件
注册中间件其实就是在setting文件中定义,格式为文件夹名+文件名+类名。如图:
我们在login模块中加入一行代码来测试中间件的运行流程:
加入:
print ('Login....')
此时访问我们的登录页面:
http://127.0.0.1:8080/login_demo
可以观察到控制台打印:
demo1_request
demo2_request
Login…
demo2_response
demo1_response
添加白名单,让某些页面不需要经过验证,
我们的login页面是不需要验证的,可能还有其他页面也不需要验证
我们可以根据session判断,带了sessionde 可以通过,没带的重定向到登录页面,
我们在中间件里面demo1类里面写入:
white_li = ['/login_demo']
class MiddlewareDemo1(MiddlewareMixin):
def process_request(self, request):
print('demo1_request')
print('session-->',request.session.get('login'))
if not request.META.get('PATH_INFO') in white_li:
if not request.session.get('login'):
print ("白名单验证。。")
return redirect('/login_demo')
def process_response(self,request,response):
print('demo1_response')
return response
此时访问:
http://127.0.0.1:8080/index_demo,自动跳转到http://127.0.0.1:8080/login_demo
控制台输出:
demo1_request
session–> None
白名单验证。。
demo1_response
[04/Jan/2019 15:54:04] “GET /login_demo HTTP/1.1” 302 0
直接访问:http://127.0.0.1:8080/login_demo
控制台输出:
demo1_request
session–> None
demo2_request
Login…
demo2_response
demo1_response
[04/Jan/2019 15:56:04] “GET /login_demo HTTP/1.1” 200 471