process_response 函数是执行完 views.py 后执行的函数python
process_response 函数有两个参数,一个是 request,一个是 response,response 是视图函数返回的响应对象django
process_response 函数的返回值必须是 HttpResponse 对象函数
middleware_test.py:url
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:3d
from django.shortcuts import HttpResponse def index(request): print("这里是 index 页面") return HttpResponse("这里是主页面 index")
访问,http://127.0.0.1:8000/index/中间件
这里没有返回 index 函数中的内容,而是直接返回 process_response 中的内容对象
执行结果:blog
能够看到先执行 process_request,而后执行 views.py,最后执行 process_responseio
并且 process_request 按照中间件的顺序执行,而 process_response 是反着执行的class
中间件收到 request 请求后,先执行 process_request 函数,当返回响应时,再执行 process_response 函数
当 process_request 函数返回 HttpResponse 时,就再也不执行后面的 process_request 函数,而会去执行 process_response 函数
如上图,中间件 3 返回了 HttpResponse,因此再也不执行中间件 四、五、6 的 process_request 函数和 process_response 函数,而是继续执行中间件 三、二、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