首页 > 代码库 > 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-中间件