中间键应用
########## 中间键
请求-中间键-路由-视图-数据库-模版-视图-中间键-响应
对所有请求做操作的时候,比如IP访问,我们利用中间键屏蔽IP
对某几个函数做操作,可以用装饰器
登陆 crsf 日志 都可以写在中间键里
中间键是一个类
请求的方法—press_request
响应的方法—prcess_response
########### Settings 配置
1 SJF = "user_info" 2 3 MIDDLEWARE = [ 4 'md.md.M1', 5 'md.md.M2', 6 ]
########### 中间键的创建
1 ########### 继承的类,可以直接粘贴过去用 2 class MiddlewareMixin(object): 3 def __init__(self, get_response=None): 4 self.get_response = get_response 5 super(MiddlewareMixin, self).__init__() 6 7 def __call__(self, request): 8 response = None 9 if hasattr(self, 'process_request'): 10 response = self.process_request(request) 11 if not response: 12 response = self.get_response(request) 13 if hasattr(self, 'process_response'): 14 response = self.process_response(request, response) 15 return response 16 17 ########### 自定义的中间键,要继承 MiddlewareMixin 18 class M1(MiddlewareMixin): 19 20 def process_request(self,request): 21 print('m1.process_request') 22 return None # 默认就是None,结束当前,继续下面代码 23 24 def process_response(self,request,response): 25 print('m1.process_response') 26 return response 27 28 29 class M2(MiddlewareMixin): 30 31 def process_request(self,request): 32 print('m2.process_request') 33 34 def process_response(self,request,response): 35 print('m2.process_response') 36 return response 37 38 执行顺序,m1.request m2.request m2.response m1.response 39 如果 m1 没有response 执行顺序 40 m1.request m2.request m2.response 41 如果 m1 的response 直接返回了 执行顺序 42 m1.request m1.response
实例,通过中间键判断用户是否登陆
1 可以直接在m1.request里面判断请求过来session里面是否有这个用户,没有直接返回登陆 2 from django.conf import settings 3 from django.shortcuts import redirect 4 5 ########### 继承类 6 class M1(MiddlewareMixin): 7 8 def process_request(self,request): 9 # 无返回值:继续执行后续中间件和视图函数 10 # 有返回值:执行自己的process_response和上面的response 11 # request.xxxx= str: 添加数据,那么每次request里面都会有这个数据 12 if request.path_info == "/login/": 13 return None # 结束当前,继续后面的代码 m2.request m2.response …… 14 15 user_info = request.session.get(settings.SJF) 16 if not user_info: 17 return redirect('/login/') # 注意重定向次数过多 18 19 20 def process_response(self,request,response): 21 print('m1.process_response') 22 return response 23 24 注意: 25 settings 中间键顺序,自己写的不要写默认的上边,日志可以写在上面,都可以记录包括默认的