Django中间件

Django中间件
  • 中间件的介绍
    • 什么是Django的中间件
      • Django中的中间件是一个轻量级、底层的 插件系统,它可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。IoC: inversion-of-control 反转控制
    • Django中间件的实质
      • django项目中的中间件(middleware),它们其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
    • Django中间件的作用
      • 介入Django的请求和响应处理过程:就是说Django接到请求之后,url的匹配过程、view的处理过程、models的调用过程、模板的渲染过程等,只要是在django内部做的所有操作,虽然那些过程的代码都已经写死了,但是中间件是都能插上一脚,干预一下,避免修改django源代码,来达到调试的效果。
    • 中间件存在的意义
      • 干预Django的流程处理过程中的某些环节
    • 中间件使用的场景
      • view视图中如果出现非常频繁执行的内容,那么就放置到中间件中,大大的省事;比如:每次发送post请求都要进行CSRF验证,所以就把CSRF验证的代码写在中间件中
    • 中间件的思想
      • 面向切面编程,是一种框架设计思想切面的意思就是:把一个项目切割成几个层,然后可以分别观察处理等操作
    • Django中间件的setting配置
  • 中间件与Django访问流程的关系
    • 数字箭头代表各种中间件干预的位置,穿插在各个Django的处理流程中间
  • 中间件六方法
    • 1.__init__()
      • 初始化:无需任何参数,服务器响应同一用户的第一个请求的时候调用一次,用于确定是否启用当前中间件,以后只要是同一用户的请求,就不在调用了
    • 2.process_request(request)
      • 处理请求前:在每个请求上调用,返回None或HttpResponse对象
    • 3.process_view(request, view_func, view_args, view_kwargs)
      • 处理视图前:在每个请求上调用,返回None或HttpResponse对象
    • 4.process_template_response(request, response)    ----不能显示结果结果
      • 处理模板响应前:在每个请求上调用,返回实现了render方法的响应对象
    • 5.process_response(request, response)
      • 处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
    • 6.process_exception(request,exception)
      • 异常处理:当视图抛出异常时调用(raise异常的时候也会被调用),在每个请求上调用,返回一个HttpResponse对象,只有发生状态码为5XX之类的错误才叫异常
  • 中间件的简单操作
中间件的执行流程
  • 中间件干预的过程
    • 注册了的中间件,中间件函数会对其影响的django中间过程进行干预,对request和Response进行处理或者返回给客户端
  • 中间件执行的顺序
    • 对请求进行处理的中间件(process_request、process_view
      • 在处理请求之前进行调用,当多个中间件定义了process_request、process_view方法,先注册的中间件,会先执行
    • 对响应进行处理的中间件(process_response
      • 当视图处理之前进行调用,当多个中间件定义了process_response方法,对Response进行返回的时候,先注册的中空间件会后执行,后注册的中间件会先执行
    • 对异常进行处理的中间件(process_exception
      • 当view视图产生异常的时候调用, 当多个中间件中定义了process_exception方法的时候,那么先注册的中间件其方法后执行,后注册的中间件其方法先执行
  • 中间件对响应的返回
    • Django的处理响应过程,第基于短路处理的,当某个中间件在处理的时候返回了HttpResponse给客户端,那么响应过程终止,之后的中间件和view函数处理等将不会再进行;
    • 最终的响应是由process_response中间件来返回的,所以不管是中间件返回响应,还是view函数返回了响应,会直接经过process_response中间件方法,再将响应返回给客户端浏览器;
    • 如果在view视图中产生异常,最终响应便不是由process_response中间件来进行处理的,是由precess_exception方法来进行处理响应并返回;
  • 中间件处理响应和返回响应的示意图

记录浏览器上一次访问的页面的中间件

刘小恺(Kyle) wechat
如有疑问可联系博主