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

Python Django中間件使用原理及流程分析

 更新時間:2020年06月13日 11:39:01   作者:_夕顏  
這篇文章主要介紹了Python Django中間件使用原理及流程分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一、什么是Django中間件

  Django 中間件是用來處理Django的請求request和響應response的框架級別的鉤子,它是一個輕量,低級別的插件系統(tǒng),用于全局范圍內(nèi)改變Django的輸入,輸出。每個中間件組件都負責做一些特定的功能。

說的直白一點是中間件就是幫我們程序員在視圖函數(shù)執(zhí)行之前和執(zhí)行之后都可以一些額外的操作,它是一個自定義的類,類中定義了幾個方法,Django框架會在請求的特定時間去執(zhí)行這些方法。

二、Django中間件的定義規(guī)則

  1、 自定義中間件的規(guī)則

   ?。?)要繼承MIDDLEWAREMIXIN類    

from django.utils.deprecation import MiddlewareMixin

    (2)要重寫父類方法 

      父類的五個方法(主要process_request process_response)

     ?。?)process_request(self,request)                

        *主要方法。請求剛進來時,執(zhí)行視圖函數(shù)之前調(diào)用。(無return)

     1.中間件的process_request方法是在執(zhí)行視圖函數(shù)之前執(zhí)行的

     2.當配置中間件時,會按照MIDDLEWARE的注冊順序,也就是列表的索引值,從前到后依次執(zhí)行的。

     3.不同中間件之間傳遞的request都是同一個對象。

      (2)process_view(self,request,view_func,view_args,view_kwargs)  

         *URL路由匹配成功后,執(zhí)行視圖函數(shù)之前調(diào)用,拿到視圖函數(shù)對象,及其所有參數(shù)。(無return)       

'''
process_view(self, request, view_func, view_args, view_kwargs)

request是HttpRequest對象。
view_func是Django即將使用的視圖函數(shù)。 (它是實際的函數(shù)對象,而不是函數(shù)的名稱作為字符串。)
view_args是將傳遞給視圖的位置參數(shù)的列表.
view_kwargs是將傳遞給視圖的關(guān)鍵字參數(shù)的字典。 view_args和view_kwargs都不包含第一個視圖參數(shù)(request)。
'''

      (3)process_template_response(self,request,response)       

         *很少用。執(zhí)行了render()渲染方法后調(diào)用。(有return)

     ?。?)process_exception(self,request,exception)           

        執(zhí)行視圖函數(shù)中遇到異常時調(diào)用。(無return)

        *該方法有兩個參數(shù):

        一個是httpresponse對象

        一個是視圖函數(shù)產(chǎn)生的exception對象

        這個函數(shù)只有在視圖函數(shù)拋出異常才可以執(zhí)行,它返回none或者httpresponse對象,如果是httpresponse對象,django將調(diào)用模板和中間件中的process_reponse方法,并將返回給瀏覽器,否則默認處理異常,如果返回none,則交給下一個中間件的process_exception方法來處理執(zhí)行,它的執(zhí)行順序也是按照中間件注冊順序的倒序執(zhí)行。

     ?。?)process_response(self,request,response)            

        主要方法。執(zhí)行視圖函數(shù)結(jié)束之后有響應時調(diào)用。(有return)

    返回值可以是一個NONE,或者HttpResponse對象,如果是none,繼續(xù)按照django定義的向下執(zhí)行,交給下個中間件處理,如果返回是Httpresponse對象,django將不執(zhí)行視圖函數(shù),則直接將該對象返回給用戶。

   ?。?)將自定義中間件類添加到setting.py文件中的MIDDLEWARE配置項里  

    setting.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',
  
  # 自定義 在對應app內(nèi)創(chuàng)建一個 my_middleware.py文件,然后定義類名為Middleware的中間件
  'app.my_middleware.Middleware',
]

# 白名單路徑,不需要做登陸就能訪問的頁面
WHITE_LIST = ['/login/', '/logout/']

  MIDDLEWARE是一個列表,列表中是一個個字符串,這些字符串其實是類,也就是中間件。

三、代碼實現(xiàn)

    my_middleware.py

from django.utils.deprecation import MiddlewareMixin # 導入中間間模塊
from django.shortcuts import redirect # 返回頁面模塊
from middlewareDemo import settings # 導入白名單


class Middleware(MiddlewareMixin): # 認證中間件

  def process_request(self, request):
    """
    請求來之前判斷是否已經(jīng)登錄
    :param request:
    :return:
    """
    white_list = settings.WHITE_LIST

    if request.path in white_list:
      return None # 如果是白名單的路徑,直接跳過
    if not request.user.is_authenticated: # 獲取用戶是否登陸
      return redirect('/login/')
  
  def process_response(self, request, response):
    """
    不管是何執(zhí)行結(jié)果,都會返回相應的HttpResonse對象
    :param request:
    :param response:
    :return:
    """
    print('m1.process_response')
    return response

  def process_exception(self, request, exception):
    """
    出現(xiàn)異常才會被調(diào)用進行異常處理
    :param request:
    :param exception:
    :return:
    """
    print('m1.process_exception')

四、中間件的使用場景

  1.做IP限制

  放在中間件類的列表中,阻止某些ip訪問;

  2.URL訪問過濾

  如果用戶訪問的是logo視圖(放過)

  如果訪問其他視圖,需要檢測是否已經(jīng)有session,已經(jīng)有了放行,如果沒有返回login,這樣就省的在多個視圖函數(shù)上寫裝飾器了!

  3.緩存

  客戶端請求來了,中間件去緩存看看有沒有數(shù)據(jù),有直接返回給用戶,沒有再去邏輯層執(zhí)行視圖函數(shù)

  4、CSRF

  Django項目中默認啟用了csrf保護,每次請求時通過CSRF中間件檢查請求中是否有正確token值

五、Django中間件與裝飾器的區(qū)別

  1、Django 中間件:在視圖函數(shù)執(zhí)行之前先去進行處理,在視圖函數(shù)執(zhí)行之后再去進行收尾工作。不會區(qū)分是哪個視圖,所有的視圖統(tǒng)統(tǒng)一視同仁,都會執(zhí)行之前進行處理或請求之后進行處理。

  在Django創(chuàng)建的時候,Django默認會給我們加6個中間件?!氨热鐂ession和csrf,在視圖函數(shù)執(zhí)行前,我們就需要對它進行處理,可以使用裝飾器來做,也可以使用中間件來處理?!?/p>

  2、裝飾器:主要是作用域問題。如果給視圖函數(shù)上面添加裝飾器,它能夠保證這個視圖的方法在執(zhí)行之前或執(zhí)行之后被執(zhí)行。但是它僅僅適用于哪些視圖添加裝飾器,那些視圖會有這些作用。

  如果是做一個普遍的處理,不去區(qū)分視圖的話,就用middleware避免編寫重復功能的代碼,本質(zhì)上就是一個自定義類,類中定義了幾個方法,Django框架會在請求的特定的時間去執(zhí)行這些方法。

  可以用于登錄時的黑名單驗證。

  如果需要對特殊視圖進行處理,可以使用裝飾器。

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

相關(guān)文章

  • Python根據(jù)區(qū)號生成手機號碼的方法

    Python根據(jù)區(qū)號生成手機號碼的方法

    這篇文章主要介紹了Python根據(jù)區(qū)號生成手機號碼的方法,涉及Python隨機數(shù)與字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2015-07-07
  • 使用PyTorch將數(shù)據(jù)從CPU移動到GPU的四個方法

    使用PyTorch將數(shù)據(jù)從CPU移動到GPU的四個方法

    這篇文章給大家介紹了在 PyTorch 中,將數(shù)據(jù)從 CPU 移動到 GPU 的幾種方法,使用 .to() 方法,使用 .cuda() 方法,使用 torch.Tensor 構(gòu)造函數(shù)和使用 torch.tensor 構(gòu)造函數(shù)這四個方法,通過代碼示例介紹非常詳細,需要的朋友可以參考下
    2024-01-01
  • .img/.hdr格式轉(zhuǎn).nii格式的操作

    .img/.hdr格式轉(zhuǎn).nii格式的操作

    這篇文章主要介紹了.img/.hdr格式轉(zhuǎn).nii格式的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • pandas庫中to_datetime()方法的使用解析

    pandas庫中to_datetime()方法的使用解析

    這篇文章主要介紹了pandas庫中to_datetime()方法的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python利用wx實現(xiàn)界面按鈕和按鈕監(jiān)聽和字體改變的方法

    python利用wx實現(xiàn)界面按鈕和按鈕監(jiān)聽和字體改變的方法

    今天小編就為大家分享一篇python利用wx實現(xiàn)界面按鈕和按鈕監(jiān)聽和字體改變的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 在Python中字典根據(jù)多項規(guī)則排序的方法

    在Python中字典根據(jù)多項規(guī)則排序的方法

    今天小編就為大家分享一篇在Python中字典根據(jù)多項規(guī)則排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python常用正則表達式符號淺析

    Python常用正則表達式符號淺析

    這篇文章主要介紹了Python常用正則表達式符號,非常實用,需要的朋友可以參考下
    2014-08-08
  • Python文件路徑模式匹配glob模塊使用詳解

    Python文件路徑模式匹配glob模塊使用詳解

    這篇文章主要介紹了Python文件路徑模式匹配glob模塊使用的相關(guān)資料,glob模塊是Python中用于文件和目錄查找的工具,支持使用通配符進行模糊匹配,它可以處理簡單的文件名模式,并通過glob和iglob兩個函數(shù)實現(xiàn)文件路徑的模式匹配,需要的朋友可以參考下
    2025-04-04
  • python3.5繪制隨機漫步圖

    python3.5繪制隨機漫步圖

    這篇文章主要為大家詳細介紹了python3.5繪制隨機漫步圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • PyTorch中的torch.cat簡單介紹

    PyTorch中的torch.cat簡單介紹

    這篇文章主要介紹了PyTorch中的torch.cat,包torch包含了多維疑是的數(shù)據(jù)結(jié)構(gòu)及基于其上的多種數(shù)學操作,包含了多維張量的數(shù)據(jù)結(jié)構(gòu)以及基于其上的多種數(shù)學運算,更多相關(guān)資料?需要的小伙伴可以參考一下
    2022-03-03

最新評論

绵竹市| 绥滨县| 林口县| 竹山县| 枣强县| 阿坝| 定西市| 玛沁县| 神农架林区| 额敏县| 屯昌县| 依兰县| 威信县| 南皮县| 繁昌县| 凤山县| 南木林县| 革吉县| 隆德县| 泽州县| 抚顺市| 仙居县| 海南省| 蒙山县| 洛宁县| 分宜县| 德安县| 娱乐| 都兰县| 广南县| 乐昌市| 宜兴市| 通河县| 苗栗县| 林州市| 宝丰县| 尉氏县| 木里| 昌邑市| 洛浦县| 江阴市|