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