process_view 的执行顺序也是按照 settings.py 中的顺序来执行python
process_view 在 urls.py 的对应关系以后,在执行视图函数以前执行django
若是返回 None,则继续执行后面的中间件的 process_view 函数浏览器
若是返回 HttpResponse,则不执行后续的 process_view 函数,直接跳到第一个 process_response 函数执行函数
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") def process_view(self, request, view_func, view_args, view_kwargs): ''' :param request: 浏览器发来的 request 请求对象 :param view_func: 将要执行的视图函数的名字 :param view_args: 将要执行的视图函数的位置参数 :param view_kwargs: 将要执行的视图函数的关键字参数 :return: ''' print("这里是 Test 的 process_view 函数") print(view_func, type(view_func)) class Test2(MiddlewareMixin): def process_request(self, request): print("这是一个中间件 --> test2") def process_response(self, request, response): print("这里是 Test2 的 HttpResponse") return HttpResponse("这是 Test2 返回的 HttpResponse") def process_view(selfm, request, view_func, view_args, view_kwargs): print("这个是 Test2 的 process_view 函数") print(view_func, type(view_func))
views.py:3d
from django.shortcuts import HttpResponse def index(request): print("这里是 index 页面") return HttpResponse("这里是主页面 index")
访问,http://127.0.0.1:8000/index/中间件
运行结果:对象
首先执行 process_request 函数,而后在执行视图函数以前执行 process_view 函数,而后执行视图函数,最后执行 process_response 函数blog
process_request 只返回 None,都执行完以后,就匹配路由,找到要执行的视图函数,在执行视图函数以前先执行中间件的 process_view 函数路由
若是 process_view 返回 None,就继续执行后续的中间件的 process_view 方法,执行完全部的 process_view 函数以后就执行视图函数
若是其中有个 process_view 返回了 HttpResponse,就不执行后续的 process_view 函数,会跳到第一个 process_response 函数,并继续往下执行
例如,中间件 3 的 process_view 返回了 HttpResponse,就再也不执行后续的中间件 四、五、6 的中间件了,直接跳到中间件 6 的 process_response 函数,并接着执行中间件 五、四、三、二、1
若是有 process_request 函数返回了 HttpResponse 对象,就不执行后续的 process_request 函数,也不执行 process_view 函数,直接跳转到相应的 process_response 函数执行