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
