1. 什么是中间件
中间件是一个轻量级、底层的“插件”系统,用于全局地修改 Django 的输入或输出。中间件可以在请求到达视图函数处理之前和响应返回客户端之前执行特定的操作,从而实现各种功能,如身份验证、日志记录、压缩、内容过滤等
中间件的功能
请求预处理:在视图函数处理请求之前,执行一些前置操作,如请求验证、设置请求参数等。
响应后处理:在视图函数处理完请求后,对生成的响应进行处理,如设置 HTTP 头、压缩响应内容等。
异常处理:捕捉处理请求或响应过程中的异常。
2. 中间件定义
- 工厂函数定义中间件
def my_middleware(get_response):
def middleware(request):
print('视图函数执行之前')
response = get_response(request)
print('视图函数执行之后')
return response
return middleware
- 使用类定义中间件
class MW1(MiddlewareMixin):
def process_request(self, request):
print("MW1 process_request")
return None
def process_view(self, request, view_func, view_args, view_kwargs):
print("MW1 process_view")
return None
def process_response(self, request, response):
print("MW1 process_response")
return response
3. 中间件属性与方法介绍
-
process_request(self, request):处理请求之前调用。如果返回None,继续处理其他中间件的同一方法,如果返回HttpResponse对象,则中止处理,将响应返回给浏览器。
-
process_view(self, request, view_func, view_args, view_kwargs):调用视图函数之前调用。如果返回None,继续处理,否则返回的HttpResponse对象将直接作为响应返回给浏览器。
-
process_template_response(self, request, response):在视图函数处理完后,返回的响应对象具有render()方法时调用。如果返回None,继续处理,否则返回的HttpResponse对象将直接作为响应返回给浏览器。
-
process_response(self, request, response):所有响应返回之前调用。如果返回None,继续处理,否则返回的HttpResponse对象将直接作为响应返回给浏览器。
-
process_exception(self, request, exception):如果视图函数抛出异常,这个方法将被调用。如果返回None,异常将被重新抛出。如果返回HttpResponse对象,则中止处理,将响应返回给浏览器。
4. 中间件执行顺序
首先执行 process_request 函数,然后在执行视图函数之前执行 process_view 函数,然后执行视图函数,最后执行 process_response 函数

process_request 只返回 None,都执行完之后,就匹配路由,找到要执行的视图函数,在执行视图函数之前先执行中间件的 process_view 函数
如果 process_view 返回 None,就继续执行后续的中间件的 process_view 方法,执行完所有的 process_view 函数之后就执行视图函数
如果其中有个 process_view 返回了 HttpResponse,就不执行后续的 process_view 函数,会跳到第一个 process_response 函数,并继续往下执行!

如果有 process_request 函数返回了 HttpResponse 对象,就不执行后续的 process_request 函数,也不执行 process_view 函数,直接跳转到相应的 process_response 函数执行

211

被折叠的 条评论
为什么被折叠?



