中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Django中間件執行順序

發布時間:2020-09-09 17:47:19 來源:腳本之家 閱讀:202 作者:汪凡 欄目:開發技術

中間件

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

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

1 中間件的定義方法

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

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

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

def simple_middleware(get_response):
 # 此處編寫的代碼僅在Django第一次配置和初始化的時候執行一次。

 def middleware(request):
  # 此處編寫的代碼會在每個請求處理視圖前被調用。

  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

定義好中間件后,需要在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')

執行結果

詳解Django中間件執行順序

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

2 執行流程

詳解Django中間件執行順序

3 多個中間件的執行順序

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

詳解Django中間件執行順序

示例:

定義兩個中間件

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 被調用

總結:中間件的本質其實就是個裝飾器,對于裝飾器我之前的隨筆里也詳細說過,裝飾器的本質其實就是個閉包

詳解Django中間件執行順序

對于裝飾器來說,在這里程序從上到下執行,開始記錄裝飾器1-3,然后讀到了函數的時候,裝飾器開始裝飾,把函數的引用傳入裝飾器中,從裝飾器3開始往上裝飾,所以這時候開始執行裝飾器3的初始化,并把裝飾完的函數當做一個新的函數,再次把新的引用傳入到裝飾器2,接著裝飾器2進行初始化,再次把新的函數的引用傳入到裝飾器1進行裝飾,這時候裝飾器1的初始化開始,并開始執行,從而接下來的執行順序為1-3執行裝飾的內容,最后再執行本來的函數,達到一個對原有函數增加功能和特性的要求。

裝飾器:從程序開始的順序,從上到下讀取----》從下到上裝飾----》從上到下執行

在中間件中,執行順序等同,只不過中間件裝飾的是視圖函數或者是試圖類,會有一個init()初始化,為了便于理解我在說明裝飾器順序的時候,那里說的初始化就是現在的init(),也就是中間件在執行上也是從最接近函數或者類的中間件開始初始化,在中間件注冊時,如果有多個中間件,程序按照從上到下的順序來確認中間件,接著執行視圖函數的時候,開始從下到上的進行init(),這里的初始化init()類似于Flask框架里四種請求勾子中的請求開始前執行一次的意思,從下到上執行完init后,再從上到下執行請求前所要執行的代碼,請求完成后再從下往上執行請求后的代碼。

中間件:從程序開始的順序,從上到下讀取----》從下到上初始化init()----》從上到下執行請求前----》視圖的請求----》從下到上執行請求后

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赤壁市| 金湖县| 凌源市| 东海县| 甘洛县| 呼伦贝尔市| 旺苍县| 高州市| 新乡市| 扬中市| 德惠市| 耿马| 奇台县| 砚山县| 禹州市| 湘西| 濮阳市| 密云县| 垫江县| 崇义县| 崇信县| 徐闻县| 旬邑县| 南宫市| 日照市| 丘北县| 靖远县| 长岛县| 三穗县| 长宁县| 大渡口区| 安塞县| 眉山市| 耒阳市| 宜城市| 长丰县| 西丰县| 彰化县| 大理市| 平阳县| 宜兰市|