最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Django中間件執(zhí)行順序

 更新時間:2018年07月16日 09:04:01   作者:汪凡  
這篇文章主要介紹了詳解Django中間件執(zhí)行順序,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

中間件

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

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

1 中間件的定義方法

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

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

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

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

 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')

執(zhí)行結果

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

2 執(zhí)行流程

3 多個中間件的執(zhí)行順序

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

示例:

定義兩個中間件

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', # 添加
]

執(zhí)行結果

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

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

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

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

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

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

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

相關文章

  • Python2及Python3如何實現兼容切換

    Python2及Python3如何實現兼容切換

    這篇文章主要介紹了Python2及Python3如何實現兼容切換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 詳解Python中sorted()和sort()的使用與區(qū)別

    詳解Python中sorted()和sort()的使用與區(qū)別

    眾所周知,在Python中常用的排序函數為sorted()和sort()。本文將詳細介紹sorted()和sort()方法的代碼示例,并解釋兩者之間的區(qū)別,感興趣的可以了解一下
    2022-03-03
  • python指定路徑斜杠與反斜杠遇到的問題

    python指定路徑斜杠與反斜杠遇到的問題

    這篇文章主要介紹了python指定路徑斜杠與反斜杠遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • python中cv2.imread()和Image.open()的區(qū)別和聯系詳解

    python中cv2.imread()和Image.open()的區(qū)別和聯系詳解

    image.open和cv2.imread都是Python中用于讀取圖像文件的函數,但是它們之間有一些區(qū)別,這篇文章主要給大家介紹了關于python中cv2.imread()和Image.open()的區(qū)別和聯系,需要的朋友可以參考下
    2024-07-07
  • 基于PyInstaller各參數的含義說明

    基于PyInstaller各參數的含義說明

    這篇文章主要介紹了基于PyInstaller各參數的含義說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • pycharm 配置遠程解釋器的方法

    pycharm 配置遠程解釋器的方法

    今天小編就為大家分享一篇pycharm 配置遠程解釋器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python 字符串中的字符倒轉

    Python 字符串中的字符倒轉

    實現字符倒轉的python函數
    2008-09-09
  • Python進階之協程詳解

    Python進階之協程詳解

    這篇文章主要為大家介紹了Python進階之協程,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • tensorflow學習筆記之簡單的神經網絡訓練和測試

    tensorflow學習筆記之簡單的神經網絡訓練和測試

    這篇文章主要為大家詳細介紹了tensorflow學習筆記,用簡單的神經網絡來訓練和測試,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python的變量和簡單數字類型詳解

    python的變量和簡單數字類型詳解

    這篇文章給大家詳細介紹了python的變量和簡單數字類型,文中介紹的很詳細,相信對大家的理解和學習很有幫助,有需要的朋友們可以參考借鑒
    2021-09-09

最新評論

三江| 漳平市| 新泰市| 腾冲县| 秦安县| 延川县| 柏乡县| 黄大仙区| 娱乐| 从江县| 吉首市| 章丘市| 乌拉特后旗| 公安县| 石城县| 哈巴河县| 从江县| 济阳县| 壶关县| 昂仁县| 上饶县| 宝坻区| 襄城县| 沭阳县| 昭通市| 锡林浩特市| 石楼县| 南溪县| 阿拉善盟| 都匀市| 长兴县| 泾川县| 沛县| 德格县| 新余市| 花垣县| 类乌齐县| 突泉县| 秭归县| 彭山县| 江达县|