天天看點

Django2.2丨中間件

中間件是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,那麼該層中的洋蔥層都不會看到請求或響應,響應将隻通過請求傳入的相同層傳回。