day22-django 中间件
一、引子
最开始我们学习django 注释掉 csrf , 上一回中我们学习了 csrf , 我们大概知道了,客户端请求,到vews 函数 ,需要通过中间件验证。
今天我们就来,学习一下这个非常重要的东西,我们大概的知道,一个请求过程,如下图,图很丑,不要在意这些。。。

在其他框架,语言中都有类似的东西,有些叫管道。。。
二、中间件
先随便看看源码,了解一下中间件的本质

安装 ctrl ,点击 CsrfViewMiddleware


本质似乎是这么个,请求--中间处理--返回 。
下面我们试着自定义中间件,验证一下
三、自定义中间件
3.1.创建
3.1.1 新建 Middle, --新建 m1 --导入 父类--创建中间件类,及方法

3.2.导入

3.2.3 验证
views ,urls


在浏览器中请求一下 test


上面这个情况 是在 ,都符合验证的情况,完整的流程,
那如果中间某个中间件,不符合验证条件呢,马上被踢回去,请看下面的表演。。。


上面讲了 process_request ,process_response 这里还有一个 process_view ,process_exception,process_template_response
下面我们在着重介绍一下 process_view, 其它两个比较不常用,稍微介绍一下。
1 __author__ = 'keven' 2 3 from django.utils.deprecation import MiddlewareMixin 4 from django.shortcuts import HttpResponse 5 6 class Row1(MiddlewareMixin): 7 def process_request(self,request): 8 print("row1") 9 def process_response(self,request,response): 10 print("row") 11 return response 12 class Row2(MiddlewareMixin): 13 def process_request(self,request): 14 print("row2") 15 # #加载这里有验证,if...else 16 # return HttpResponse("get out") 17 def process_view(self,request,callback,callback_args,callback_kwargs): 18 print("view") 19 20 def process_response(self,request,response): 21 print("row1") 22 return response 23 class Row3(MiddlewareMixin): 24 def process_request(self,request): 25 print("row3") 26 def process_response(self,request,response): 27 print("row2") 28 return response
#############输出
#
Quit the server with CTRL-BREAK.
row1
row2
row3
view
fuck python
row2
row1
row
[24/Jul/2018 08:56:49] "GET /test/ HTTP/1.1" 200 6
Performing system checks...
可以得出结论,流程图。

3.2、process_exception
说明:如果view函数报错了,这个东西才会执行,否则不会执行。
|
1
2
|
def process_exception(self,request,exception): print('ex') |
这个东西不经常用,所以暂时咋不说,知道就行了。
如图:

3.3、process_template_response
说明:如果view函数返回的对象中,具有render方法,这个函数才会执行,这个东西也用不到,知道就行。
|
1
2
3
|
def process_template_response(self,request,response): print("----------") return response #继续请求下去,就要把返回值返回了 |
如图:

四、总结
- 中间件的作用:判断一下,客户端发来的请求有没有带那个请求头,如果带那个请求头,它说你不要再继续往下走了,在我这边就直接终止掉了,这个适合所有请求统一操作,公共校验,黑名单过滤就在中间件这边过滤了。
- 定义中间件的类必须继承MiddlewareMixin,并且需要在setting.py文件中导入,导入的时候到类级别即可。
- 定义的类,需要重写process_request、process_view和process_response方法,因为这三个是经常用到的,另外两个不经常用到。

浙公网安备 33010602011771号