Python - Django - 中间件 process_response
process_response 函数是执行完 views.py 后执行的函数
process_response 函数有两个参数,一个是 request,一个是 response,response 是视图函数返回的响应对象
process_response 函数的返回值必须是 HttpResponse 对象
middleware_test.py:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Test(MiddlewareMixin): def process_request(self, request): print("这是一个中间件 --> test") def process_response(self, request, response): print("这里是 Test 的 HttpResponse") return HttpResponse("这是 Test 返回的 HttpResponse") class Test2(MiddlewareMixin): def process_request(self, request): print("这是一个中间件 --> test2") def process_response(self, request, response): print("这里是 Test2 的 HttpResponse") return HttpResponse("这是 Test2 返回的 HttpResponse")
views.py:
from django.shortcuts import HttpResponse def index(request): print("这里是 index 页面") return HttpResponse("这里是主页面 index")
访问,http://127.0.0.1:8000/index/
这里没有返回 index 函数中的内容,而是直接返回 process_response 中的内容
执行结果:
可以看到先执行 process_request,然后执行 views.py,最后执行 process_response
而且 process_request 按照中间件的顺序执行,而 process_response 是反着执行的
process_request 和 process_response 的执行流程:
中间件收到 request 请求后,先执行 process_request 函数,当返回响应时,再执行 process_response 函数
当 process_request 函数返回 HttpResponse 时,就不再执行后面的 process_request 函数,而会去执行 process_response 函数
如上图,中间件 3 返回了 HttpResponse,所以不再执行中间件 4、5、6 的 process_request 函数和 process_response 函数,而是继续执行中间件 3、2、1 的 process_response 函数
middleware_test.py:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse allow_url = ['/admin/', '/uploads/', '/files/'] class Test(MiddlewareMixin): def process_request(self, request): print("这是一个中间件 --> test") def process_response(self, request, response): print("这里是 Test 的 HttpResponse") return HttpResponse("这是 Test 返回的 HttpResponse") class Test2(MiddlewareMixin): def process_request(self, request): print("这是一个中间件 --> test2") if request.path_info in allow_url: return else: return HttpResponse("--- Test2 ---") def process_response(self, request, response): print("这里是 Test2 的 HttpResponse") return HttpResponse("这是 Test2 返回的 HttpResponse")
访问,http://127.0.0.1:8000/index/
运行结果:
因为 Test2 中 process_request 中返回了 HttpResponse,所以这里只执行了 Test2 的 process_response 方法,而不再去执行后面的中间件 Test1