process_request 函數是中間件在收到 request 請求之后執行的函數
該函數的執行順序是按照 settings.py 中中間件的配置順序執行的
如果該函數返回 None,繼續執行后面的中間件的 process_request 方法
如果該函數返回 response,則不再繼續執行后面的中間件的 process_request 方法
middleware_test.py:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse allow_url = ["/admin/", "/news/", "/uploads/"] class Test(MiddlewareMixin): def process_request(self, request): print("這是一個中間件 --> test") class Test2(MiddlewareMixin): def process_request(self, request): print("這是一個中間件 --> test2") if request.path_info in allow_url: return else: return HttpResponse("這里是 HttpResponse")
views.py:
from django.shortcuts import HttpResponse def index(request): print("這里是 index 頁面") return HttpResponse("這里是主頁面 index")
訪問,http://127.0.0.1:8000/index/
運行結果:
只執行到 Test2 這個中間件,沒有再執行 Test1 這個中間件,因為 Test2 返回了 response
如果訪問,http://127.0.0.1:8000/admin/
中間件 Test1 也執行了,因為訪問的 url 在 allow_url 內,所以 process_request 返回了一個 None,程序就繼續執行后續的中間件了