国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:25日期:2022-07-21 13:50:01

一、什么是Django中間件

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

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

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

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

(1)要繼承MIDDLEWAREMIXIN類

from django.utils.deprecation import MiddlewareMixin

(2)要重寫父類方法 

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

(1)process_request(self,request)

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

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

2.當(dāng)配置中間件時,會按照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)

(4)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í)行。

(5)process_response(self,request,response)  

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

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

(3)將自定義中間件類添加到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’, # 自定義 在對應(yīng)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 # 導(dǎo)入中間間模塊from django.shortcuts import redirect # 返回頁面模塊from middlewareDemo import settings # 導(dǎo)入白名單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é)果,都會返回相應(yīng)的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避免編寫重復(fù)功能的代碼,本質(zhì)上就是一個自定義類,類中定義了幾個方法,Django框架會在請求的特定的時間去執(zhí)行這些方法。

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 成人影院在线免费观看 | 露脸 在线 国产 眼镜 | 国产高清一区二区 | 日韩a一级欧美一级 | 国内精品久久久久久野外 | 午夜成年| 欧美成人高清手机在线视频 | 国产欧美在线一区二区三区 | 老司机精品影院一区二区三区 | 国产在线视频区 | 国产高清视频在线 | 亚洲欧美一区二区三区 | 欧美日韩中文字幕在线观看 | 精品爱爱 | 成人午夜在线观看国产 | 亚洲va在线va天堂va四虎 | 欧美日韩国产亚洲一区二区三区 | 末成年娇小性色xxxxx | www.久久在线 | 日本天堂网在线 | 欧美一区永久视频免费观看 | 成人18免费网站在线观看 | 99久久国产综合精品国 | 亚洲综合第一页 | 亚洲国产精品线观看不卡 | 免费观看性欧美一级 | 国产4tube在线播放 | 国产成人精品免费视频软件 | 国产婷婷一区二区在线观看 | 99久久国产综合精品1尤物 | 日韩欧美一级毛片精品6 | 亚洲精品一区二区手机在线 | 三区在线视频 | 国产日b视频 | 97精品国产91久久久久久 | 极品美女写真菠萝蜜视频 | 欧美大屁股精品毛片视频 | 国产成人亚洲综合网站不卡 | 中文字幕精品一区二区三区视频 | 国产一级二级三级视频 | 天天噜夜夜操 |