1. 程式人生 > >Django中中介軟體的使用

Django中中介軟體的使用

Django中的中介軟體是一個輕量級、底層的外掛系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性。

我們可以使用中介軟體,在Django處理檢視的不同階段對輸入或輸出進行干預。(相當於Flask中的請求鉤子)

中介軟體使用裝飾器來實現,使用裝飾器來裝飾檢視函式,完成中介軟體的功能。

一 、定義中介軟體

# 1.定義中介軟體(裝飾器)

def my_middleware(get_response):
    # 初始化操作
    print('init操作') # debug執行模式會初始化兩次
    def middleware(request):
        # 呼叫檢視函式之前的邏輯處理
        print('呼叫檢視函式之前的邏輯處理')
        response = get_response(request)    # 呼叫檢視函式
        # 呼叫檢視函式之後的處理邏輯
        print('呼叫檢視函式之後的處理邏輯')
        return response

    return middleware

二、定義好中介軟體後,需要在settings.py 檔案中添加註冊中介軟體

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',
    'user.middleware.my_middleware'        # 新增中介軟體
]

三、測試,定義的中介軟體對每個檢視函式都有作用,一旦檢視函式被呼叫,中介軟體就被觸發,可以在控制檯檢視列印效果

def demo_view(request):
    print('view 檢視被呼叫')
    return HttpResponse('OK')

注意:Django執行在除錯模式下,中介軟體init部分有可能被呼叫兩次。

四、多箇中間件的執行順序

  • 在請求檢視被處理,中介軟體由上至下依次執行
  • 在請求檢視被處理,中介軟體由下至上依次執行
4.1定義兩個中介軟體
def my_middleware(get_response):
    print('init 被呼叫')
    def middleware(request):
        print('before request 被呼叫')
        response = get_response(request)
        print('after response 被呼叫')
        return response
    return middleware

def my_middleware2(get_response):
    print('init2 被呼叫')
    def middleware(request):
        print('before request 2 被呼叫')
        response = get_response(request)
        print('after response 2 被呼叫')
        return response
    return middleware

4.2註冊新增兩個中介軟體

'users.middleware.my_middleware',  # 新增
    'users.middleware.my_middleware2',  # 新增

4.3執行結果

init2 被呼叫
init 被呼叫
before request 被呼叫
before request 2 被呼叫
view 檢視被呼叫
after response 2 被呼叫
after response 被呼叫