Django的中间件
- 中间件是处理django的请求和响应的框架级别的钩子,本质上是一个类,位于wsgi和urls之间
- django框架中一般在app下创建中间件的文件夹,之中再创建中间件文件
- setting中
MIDDLEWARE中添加 app名字.文件夹名.文件名.类名
12.14.1 方法和特征
- 4个特征:执行时间,执行顺序,参数,返回值
process_request(self,request)process_view(self,request,view_func,view_args,view_kwargs)process_template_response(self,request,response)process_exceptionprocess_respons(self,request,response)
12.14.2 中间件的方法
12.14.2.1 process_request
- 执行时间:执行view函数之前
- 参数:request 是和视图函数中同一个request对象
- 执行顺序:按照注册的顺序,顺序执行,即setting中的
MIDDLEWARE中的中间件排列顺序 - 返回值:
- None:正常
Httpresponse对象:后面的中间process_request,视图函数都不执行,执行当前中间件process_response,然后倒序执行之前执行过的中间件,最后将结果返回给浏览器- 这里注意在django的1.10版本以前,如果返回的response对象,不是从当前中间件返回,而是从最后中间件的process_response倒序执行。
from django utils deprecation import MiddlewareMixin
12.14.2.2 process_response
- 执行时间:视图函数执行之后
- 参数:
- request 是和视图函数中同一个request对象
- response 返回给浏览器的响应对象
- 返回值:
Httpresponse:必须返回这个对象
- 执行顺序:按照注册的顺序,倒序执行
12.14.2.3 process_view
- 执行时间:视图函数之前,process_request之后
- 参数:
- request 是和视图函数中同一个request对象
- view_func 具体的视图函数def 形参名称任意
- view_args 视图函数传递的位置参数 形参名称任意
- view_kwargs 视图函数的关键字参数 形参名称任意
- 执行顺序:按照注册的顺序,顺序执行
- 返回值:
- None 正常流程
Httpresponse后面的中间件的process_view 和视图函数都不执行,直接执行最后中间件的response对象,倒序执行之前的response方法
12.14.2.4 process_exception
- 不可以执行中间件出错,只在视图层面出错执行
- 触发条件:视图层面有错时执行
- 参数:
- request 是和视图函数中同一个request对象
- exception 错误对象
- 执行顺序:按照注册顺序,倒序执行
- 返回值:
- None:交给下一个中间件处理异常 ,都没有处理交给django处理
Httpresponse:后面的中间件的process_view 和视图函数都不执行,直接执行最后中间件的response对象,倒序执行之前的response方法
12.14.2.5 process_template_response
- 作用:类似render,在视图函数完毕后
-
触发条件:视图返回一个templateResponse对象
-
参数:
- request 视图函数中的是同一个request对象
- response templateResponse 对象
-
执行顺序:按照注册的顺序倒序执行
-
返回值:必须返回Httpresponse对象 可以处理模板,数据
def process_template_response(self, request, response): response.template_name = '模板的文件名' response.context_data = {}
12.14.3 总结

12.14.4 日常哪些用到了中间件
- 用户认证
- rbac权限管理
- 黑白名单
- session 的原理 在process_request 中赋值session 在process_response中将session的全部修改到数据库
- csrftoken 的原理 在process_view

浙公网安备 33010602011771号