'middlewares.MD1', # 自定义中间件 MD1
'middlewares.MD2' # 自定义中间件 MD2]
复制
此时,我们访问一个视图,会发现终端中打印如下内容:
MD1 里面的 process_requestMD2 里面的 process_request
app01 中的 index 视图
复制
把 MD1 和 MD2 的位置调换一下,再访问一个视图,会发现终端中打印的内容如下:
MD2 里面的 process_requestMD1 里面的 process_request
app01 中的 index 视图
复制
看结果我们知道:视图函数还是最后执行的,MD2 比 MD1 先执行自己的 process_request
方法。
在打印一下两个自定义中间件中 process_request 方法中的 request 参数,会发现它们是同
一个对象。
由此总结一下:
1. 中间件的 process_request 方法是在执行视图函数之前执行的。
2. 当配置多个中间件时,会按照 MIDDLEWARE 中的注册顺序,也就是列表的索引值,
从前到后依次执行的。
3. 不同中间件之间传递的 request 都是同一个对象
多个中间件中的 process_response 方法是按照 MIDDLEWARE 中的注册顺序倒序执行的,
也就是说第一个中间件的 process_request 方法首先执行,而它的 process_response 方法
最后执行,最后一个中间件的 process_request 方法最后一个执行,它的 process_response
方法是最先执行。
process_response
它有两个参数,一个是 request,一个是 response,request 就是上述例子中一样的对象,
response 是视图函数返回的 HttpResponse 对象。该方法的返回值也必须是 HttpResponse
对象。
给上述的 M1 和 M2 加上 process_response 方法:
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self, request):
print("MD1 里面的 process_request")