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 函數執行