最短時間攻透最完善的Python框架——Django⑫

中間件

中間件:是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。

中間件的設計爲開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性。

我們可以使用中間件,在Django處理視圖的不同階段對輸入或輸出進行干預。

附上一副圖助大家理解,話在圖中,請細品

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳下上傳(imgKk8vjVqvw-1591062879859)(最短時間攻透最完善的Python框架——Django⑫.assets/中間件執行流程.png)(最短時間攻透最完善的Python框架——Django⑫.assets/中間件執行流程.png)]

1.中間件的定義方法

定義一箇中間件工廠函數,然後返回一個可以被調用的中間件。

中間件工廠函數需要接收一個可以調用的get_response對象。

返回的中間件也是一個可以被調用的對象,並且像視圖一樣需要接收一個request對象參數,返回一個response對象。

注意:前後區分

def small_middleware(get_response):
    # 此處編寫的代碼僅在Django第一次配置和初始化的時候執行一次。
	pass
    def middleware(request):
        # 此處編寫的代碼會在每個請求處理視圖前被調用。
		pass
        response = get_response(request)

        # 此處編寫的代碼會在每個請求處理視圖之後被調用。

        return response

    return middleware

舉個栗子,在users應用中創建middleware.py

def my_middleware(get_response):
    print('init 被調用')
    def middleware(request):
        print('before request 被調用')     #上
        response = get_response(request)
        print('after response 被調用')     #下
        return response
    return middleware

定義好中間件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',
    'users.middleware.my_middleware',  # 跟隨路徑添加中間件
]

定義一個視圖進行測試

def demo_view(request):
    print('view 視圖被調用')
    return HttpResponse('OK')

執行結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yPF8Ook6-1591062879860)(最短時間攻透最完善的Python框架——Django⑫.assets/middleware_demo.png)]

注意:Django運行在調試模式(Debug)下,中間件init部分有可能被調用兩次。

2.多箇中間件的執行

  • 在請求視圖被處理前,中間件由上至下依次執行
  • 在請求視圖被處理後,中間件由下至上依次執行

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0VdaerO3-1591062879861)(最短時間攻透最完善的Python框架——Django⑫.assets/middleware_sequence.png)]

定義兩個中間件

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

註冊添加兩個中間件

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',
    'users.middleware.my_middleware',  # 跟隨路徑添加中間件
    'users.middleware.my_middleware2',  # 跟隨路徑添加中間件
]

執行結果

init2 被調用
init 被調用
before request 被調用
before request 2 被調用
view 視圖被調用
after response 2 被調用
after response 被調用

總結:整體來說這篇博文,有點水,不需要過於認證閱讀,搞清執行順序即可
@Author:HaoXuan

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章