溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是Django框架的中間件

發(fā)布時(shí)間:2020-08-25 09:22:04 來(lái)源:億速云 閱讀:153 作者:Leah 欄目:編程語(yǔ)言

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹什么是Django框架的中間件,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

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

但是由于其影響的是全局,所以需要謹(jǐn)慎使用,使用不當(dāng)會(huì)影響性能。

說(shuō)的直白一點(diǎn)中間件是幫助我們?cè)谝晥D函數(shù)執(zhí)行之前和執(zhí)行之后都可以做一些額外的操作,它本質(zhì)上就是一個(gè)自定義類(lèi),類(lèi)中定義了幾個(gè)方法,Django框架會(huì)在請(qǐng)求的特定的時(shí)間去執(zhí)行這些方法。

我們一直都在使用中間件,只是沒(méi)有注意到而已,打開(kāi)Django項(xiàng)目的Settings.py文件,看到下圖的MIDDLEWARE配置項(xiàng)。

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',
]

MIDDLEWARE配置項(xiàng)是一個(gè)列表,列表中是一個(gè)個(gè)字符串,這些字符串其實(shí)是一個(gè)個(gè)類(lèi),也就是一個(gè)個(gè)中間件。

我們之前已經(jīng)接觸過(guò)一個(gè)csrf相關(guān)的中間件了?我們一開(kāi)始讓大家把他注釋掉,再提交post請(qǐng)求的時(shí)候,就不會(huì)被forbidden了,后來(lái)學(xué)會(huì)使用csrf_token之后就不再注釋這個(gè)中間件了。

Django中間件的運(yùn)行原理:

那接下來(lái)就學(xué)習(xí)中間件中的方法以及這些方法什么時(shí)候被執(zhí)行。

請(qǐng)求到達(dá)中間件之后,先按照正序執(zhí)行每個(gè)注冊(cè)中間件的process_reques方法,process_request方法返回的值是None,就依次執(zhí)行,如果返回的值是HttpResponse對(duì)象,不再執(zhí)行后面的process_request方法,而是執(zhí)行當(dāng)前對(duì)應(yīng)中間件的process_response方法,將HttpResponse對(duì)象返回給瀏覽器。

也就是說(shuō):如果MIDDLEWARE中注冊(cè)了6個(gè)中間件,執(zhí)行過(guò)程中,第3個(gè)中間件返回了一個(gè)HttpResponse對(duì)象,那么第4,5,6中間件的process_request和process_response方法都不執(zhí)行,順序執(zhí)行3,2,1中間件的process_response方法。

process_request方法都執(zhí)行完后,匹配路由,找到要執(zhí)行的視圖函數(shù),先不執(zhí)行視圖函數(shù),先執(zhí)行中間件中的process_view方法,process_view方法返回None,繼續(xù)按順序執(zhí)行,所有process_view方法執(zhí)行完后執(zhí)行視圖函數(shù)。加入中間件3 的process_view方法返回了HttpResponse對(duì)象,則4,5,6的process_view以及視圖函數(shù)都不執(zhí)行,直接從最后一個(gè)中間件,也就是中間件6的process_response方法開(kāi)始倒序執(zhí)行。

process_template_response和process_exception兩個(gè)方法的觸發(fā)是有條件的,執(zhí)行順序也是倒序??偨Y(jié)所有的執(zhí)行流程如下:

什么是Django框架的中間件

關(guān)于什么是Django框架的中間件就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI