中间件
What?
中间件是一个用来处理django请求与响应的框架级别的钩子,是一个轻量、低级别的插件系统。用于在全局范围内改变django的输入输出
说白了,中间件就是一个类视图,类里边包含很多自定义的函数,这些函数的具体功能才是中间件实现的根本
自定义函数
process_request(self, request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self, request, response)
process_exception(self, request, exception)
process_response(self, request, response)
How?
1. process_request
1. 执行时间
在视图函数之前执行
2. 参数
request 和视图中的request是同一个
3. 返回值
返回None
返回response对象
不执行后面中间的process_request方法和视图
直接执行当前值中间件的process_response方法
4. 执行顺序
按照注册的顺序执行
2. process_response
1. 执行时间
在视图函数之后执行
2. request, response
request 和视图中的request是同一个
response 返回的response对象
3. 返回值
返回response对象
4. 执行顺序
按照注册的倒序执行
3. process_view
1. 执行时间
在视图函数之前,process_request之后执行
2. 参数
view_func 将要执行的视图函数
view_args 视图函数的可变长位置参数
view_kwargs 视图函数的可变长关键字参数
3. 返回值
返回 None 正常执行
返回 response对象 不执行后面的process_view和视图,直接执行所有中间件的process_response方法
4。执行顺序
按照注册的顺序执行
4. process_exception(有条件触发:有错误才执行)
1. 执行时间
在视图函数之后,process_response之前执行
2. 参数
exception 错误对象
3. 返回值
返回 None 不对错误进行处理,交给下一个中间件进行处理
返回 response对象 下一个中间的process_exception不执行,直接执行所有中间件的process_response方法
4. 执行顺序
按照注册的倒序执行
5. process_template_response(条件触发:视图返回的response有render方法)
1. 执行时间
在视图函数之后,process_response之前执行
2. 参数
3. 返回值
返回 response对象
4. 执行顺序
按照注册的倒序执行,执行完所有的process_template_response方法后执行response.render方法
中间件的执行流程?
请求到达中间件之后,先按照settings中注册的中间件顺序进行执行,然后执行每个中间件的process_request,如果返回值为None,继续执行下一个中间件,如果返回值为HttpResponse对象,不再执行后面的中间件,而是执行当前中间件的process_response方法,将HttpResponse对象返回给浏览器。同理适用于process_view方法