首页 > 代码库 > day11-中间件

day11-中间件

概述

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。

与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类

中间件中可以定义四个方法,分别是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

 

process_request 和 process_response

两者分别是在url指定的views中的函数执行的前后触发

  • process_request可以在views中的函数处理请求之前进行一些操作,例如:记录请求日志、对ip黑名单拒绝请求。
  • process_response可以在views中的函数处理请求后进行一些操作,例如:修改相应response的内容(gizp压缩)、返回给用户一个自己的response

如果使用有多个中间件时,执行的流程如图:
实线部分的整个流程:【用户发出请求】 --> 【按书写顺序从上到下触发中间件中的process_request方法】--> 【执行路由到指定的views中的函数】--> 【按书写顺序从下到上触发中间件的process_response方法】

上述的过程其实是理想状态下的执行顺序,即:每一个 process_request 方法都满足我们定义的规则(返回了None),例如:请求者的 IP 不在黑名单里,给他放行了。

虚线部分是什么意思?

其实它就表示该 process_request 方法没有满足我们定义的规则(返回了HttpResonse对象),例如:请求者的IP在黑名单里,禁止访问,返回给一个指定的httpresonse对象。

值得注意的是,所有中间件中只要有一个 process_request 方法返回了HttpResonse对象,下面的 process_request 方法就不会再继续执行,而是直接去从下到上执行所有的 process_response 方法,没错,是所有的!!!

 

process_view

在request之后, 在执行view之前调用。

 

process_exception

 如果试图异常,那么会倒序去执行 exception

day11-中间件