Django中间件 (middleware)
-
中间件是处理django的请求和响应的框架级别的钩子,本质是一个类(直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作)
-
由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
-
定义的中间件需要注册
-
django中请求响应流程
1.中间件定义的五个方法:
- process_request(self,request)
- process_response(self, request, response)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_exception(self, request, exception)
- process_template_response(self,request,response)
1.1 process_request
- process_request(self,request)
特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
- 执行时间: 在执行视图函数之前执行
- 参数: request
- request和视图函数中的的request是一个对象
- 执行顺序:
- 按照注册的顺序进行执行
- 返回值:
- 返回值为none的时候,执行顺序正常
- 返回值如果是HttpResponse, 后面的中间件的process_request、视图函数都不执行,直接执行当前中间件中的process_response方法,再倒序执行之前的中间件中process_response方法。
1.2 process_response
- process_response(self, request, response)
特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
- 执行时间: 在执行视图函数之后执行
- 参数: request / response
- request 和视图函数中的的request是一个对象
- response 返回给浏览器响应对象(不一定是视图对象,peocess_request也会返回对象)
- 执行顺序:
- 按照注册的顺序,倒序执行
- 返回值:
- HttpResponse:必须返回response对象
- process_request执行流程
1.3 process_view
- process_view(self, request, view_func, view_args, view_kwargs)
特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
-
执行时间: 视图函数之前,process_request之后
-
参数: request
- request 和视图函数中的的request是一个对象
- view_func 视图函数
- view_args 视图函数的位置参数
- view_kwargs 视图函数的关键字参数
-
执行顺序:
- 按照注册的顺序进行执行
-
返回值:
- 返回值为none的时候, 执行顺序正常
- 返回值如果是HttpResponse, 后面的中间的process_view、视图函数都不执行,直接执行注册的最后一个中间件中的process_response方法,再倒叙执行之前的中间中process_response方法。
- 执行流程图
1.4process_exception
- process_exception(self, request, exception)
特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
-
执行时间((触发条件)): 视图函数之后,视图层面有错时才执行
-
参数: request/exception
- request 和视图函数中的的request是一个对象
- exception 视图中的错误对象
-
执行顺序:
- 按照注册的顺序 倒叙执行
-
返回值:
- 返回值为none的时候, 交给下一个中间件取处理异常,都没有处理交由django处理异常
- 返回值如果是HttpResponse, 后面的中间件的process_exception不执行,直接执行最后一个中间件中的process_response方法,倒叙执行之前的中间中process_response方法。
- 流程图
1.5process_template_response
- process_template_response(self,request,response)
特征
在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行
-
执行时间((触发条件)): 视图函数之后,视图返回的是一个templateResponse对象(跟render用法类似)
-
参数: ,request,response
- request 和视图函数中的的request是一个对象
- response templateResponse对象
-
执行顺序:
- 按照注册的顺序 倒叙执行
-
返回值:
- HttpResponse:必须返回response对象
- 流程图