中间件是处理django的请求和响应的框架级别的钩子,本质是一个类(直白一点中间件是帮助咱们在视图函数执行以前和执行以后均可以作一些额外的操做)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)
特征
在视图函数以前执行的中间件方法按照注册顺序执行,在视图函数以后执行的中间件方法按照注册顺序倒序执行
code
- 执行时间: 在执行视图函数以后执行
- 参数: request / response
- request 和视图函数中的的request是一个对象
- response 返回给浏览器响应对象(不必定是视图对象,peocess_request也会返回对象)
- 执行顺序:
- 返回值:
- HttpResponse:必须返回response对象

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)
特征
在视图函数以前执行的中间件方法按照注册顺序执行,在视图函数以后执行的中间件方法按照注册顺序倒序执行
blog
- 执行时间((触发条件)): 视图函数以后,视图返回的是一个templateResponse对象(跟render用法相似)
- 参数: ,request,response
- request 和视图函数中的的request是一个对象
- response templateResponse对象
- 执行顺序:
- 返回值:
- HttpResponse:必须返回response对象

2.完整的django请求的生命周期
