中間件是Django請求/響應處理的鈎子架構。它是一個輕量級的,低級的“插件”系統,用于全部改變Django的輸入或輸出。
自定義中間件
中間件是一個可調用的程式,它接受get_response可調用并傳回中間件。
示例
def simple_middleware(get_response):
# One-time configuration and initialization.
def middleware(request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
return middleware
或者寫成一個類
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
Django提供的get_response想i也能夠可能是實際視圖,或者是鍊中的下一個中間件。
激活中間件
要激活中間件元件,将添加到Django設定中的MIDDLEWARE清單中。
示例
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
注:
MIDDLEWARE的順序很重要,因為中間件會依賴其他中間件。
例:類AuthenticationMiddleware在會話中存儲經過身份驗證的使用者;是以,必須在SessionMiddleware後面運作。
中間件順序與分層
在請求階段,調用視圖之前,Django按照定義的順序引用中間件,自定向下。
可以想象成一個洋蔥,每個中間件類都是一個層,覆寫了洋蔥的核心。如果請求通過洋蔥所有層已将請求傳遞到下一層,一直到核心的視圖,那麼響應給将在傳回的過程中通過每個層(以相反的順序)
如果其中一層決定停止并傳回響應而不調用get_response,那麼該層中的洋蔥層都不會看到請求或響應,響應将隻通過請求傳入的相同層傳回。