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_exception
  • process_respons(self,request,response)

12.14.2 中间件的方法

12.14.2.1 process_request
  1. 执行时间:执行view函数之前
  2. 参数:request 是和视图函数中同一个request对象
  3. 执行顺序:按照注册的顺序,顺序执行,即setting中的MIDDLEWARE中的中间件排列顺序
  4. 返回值:
    • None:正常
    • Httpresponse对象:后面的中间process_request,视图函数都不执行,执行当前中间件process_response,然后倒序执行之前执行过的中间件,最后将结果返回给浏览器
    • 这里注意在django的1.10版本以前,如果返回的response对象,不是从当前中间件返回,而是从最后中间件的process_response倒序执行。
from django utils deprecation import MiddlewareMixin
12.14.2.2 process_response
  1. 执行时间:视图函数执行之后
  2. 参数:
    • request 是和视图函数中同一个request对象
    • response 返回给浏览器的响应对象
  3. 返回值:
    • Httpresponse:必须返回这个对象
  4. 执行顺序:按照注册的顺序,倒序执行
12.14.2.3 process_view
  1. 执行时间:视图函数之前,process_request之后
  2. 参数:
    • request 是和视图函数中同一个request对象
    • view_func 具体的视图函数def 形参名称任意
    • view_args 视图函数传递的位置参数 形参名称任意
    • view_kwargs 视图函数的关键字参数 形参名称任意
  3. 执行顺序:按照注册的顺序,顺序执行
  4. 返回值:
    • None 正常流程
    • Httpresponse 后面的中间件的process_view 和视图函数都不执行,直接执行最后中间件的response对象,倒序执行之前的response方法
12.14.2.4 process_exception
  • 不可以执行中间件出错,只在视图层面出错执行
  1. 触发条件:视图层面有错时执行
  2. 参数:
    • request 是和视图函数中同一个request对象
    • exception 错误对象
  3. 执行顺序:按照注册顺序,倒序执行
  4. 返回值:
    • None:交给下一个中间件处理异常 ,都没有处理交给django处理
    • Httpresponse:后面的中间件的process_view 和视图函数都不执行,直接执行最后中间件的response对象,倒序执行之前的response方法
12.14.2.5 process_template_response
  • 作用:类似render,在视图函数完毕后
  1. 触发条件:视图返回一个templateResponse对象

  2. 参数:

    • request 视图函数中的是同一个request对象
    • response templateResponse 对象
  3. 执行顺序:按照注册的顺序倒序执行

  4. 返回值:必须返回Httpresponse对象 可以处理模板,数据

    def process_template_response(self, request, response):
        response.template_name = '模板的文件名'
        response.context_data = {}
    

12.14.3 总结

12.14.4 日常哪些用到了中间件

  1. 用户认证
  2. rbac权限管理
  3. 黑白名单
  4. session 的原理 在process_request 中赋值session 在process_response中将session的全部修改到数据库
  5. csrftoken 的原理 在process_view
posted @ 2019-11-02 17:29  Kn19ht  阅读(63)  评论(0)    收藏  举报