中间键应用

########## 中间键

请求-中间键-路由-视图-数据库-模版-视图-中间键-响应

对所有请求做操作的时候,比如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 中间键顺序,自己写的不要写默认的上边,日志可以写在上面,都可以记录包括默认的

 

posted @ 2018-01-02 03:05  liqianlong  阅读(325)  评论(0编辑  收藏  举报