Django2.0中文(中間件)

1豹休、
中間件是一個(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è)自定義類,類中定義了幾個(gè)方法瓷叫,Django框架會(huì)在請(qǐng)求的特定時(shí)間去執(zhí)行這些方法屯吊。
2、中間的五種方法:
process_request(self, request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self, request, response)
process_exception(self, request, exception)
process_response(self, request, response)
以上方法的返回值可以是None摹菠,或者是一個(gè)HttpResponse對(duì)象盒卸,如果是None,則繼續(xù)按照django定義的規(guī)則向后繼續(xù)執(zhí)行次氨,如果是HttpResponse對(duì)象世落,則直接將改對(duì)象返回給用戶。
3糟需、自定義中間件:
from django.utils.deprecation import MiddlewareMixin

class MD1(MiddlewareMixin):
def process_request(self, request):
print("我是MD1的process_request方法")
def process_response(self, request, response):
print("我是MD1的process_response方法")
return response
class MD2(MiddlewareMixin):
def process_request(self, request):
print("我是MD2的process_request方法")
def process_response(self, request, response):
print("我是MD2的process_response方法")
return response

//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',
# 自定義中間件(注意順序)
'untitled01.my_middlewares.MD1',
'untitled01.my_middlewares.MD2',
]
4、執(zhí)行流程:
請(qǐng)求到達(dá)中間件之后谷朝,先按照正序執(zhí)行每個(gè)注冊(cè)中間件的process_request方法洲押,如果process_request方法返回的值是None,就依次執(zhí)行圆凰;如果返回的值是HttpResponse對(duì)象杈帐,則不再執(zhí)行后面的process_request方法,而是執(zhí)行當(dāng)前對(duì)象中間件的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方法尽楔。


image.png

process_request方法都執(zhí)行完后,匹配路由第练,找到要執(zhí)行的視圖函數(shù)阔馋,先不執(zhí)行視圖函數(shù),而是先執(zhí)行中間件中的process_view方法娇掏,process_view方法返回None呕寝,則繼續(xù)按順序執(zhí)行,所有的process_view方法執(zhí)行完后婴梧,在執(zhí)行視圖函數(shù)下梢。如果中間件 3 的process_view方法返回了一個(gè)HttpResponse對(duì)象客蹋,則4, 5, 6的process_view以及視圖函數(shù)都不執(zhí)行了,而是直接從最后一個(gè)中間件怔球,也就是中間件 6 的process_response方法開(kāi)始倒序執(zhí)行嚼酝。


image.png

image.png

image.png

當(dāng)最后一個(gè)中間的process_request到達(dá)路由關(guān)系映射之后,返回到中間件1的process_view竟坛,然后依次往下闽巩,到達(dá)views函數(shù),最后通過(guò)process_response依次返回到達(dá)用戶


process_exception(self, request, exception)
當(dāng)views的函數(shù)中出現(xiàn)錯(cuò)誤時(shí)担汤,就會(huì)執(zhí)行process_exception方法
如果在中間中添加了process_exception方法涎跨,工作圖示為:


image.png

這樣當(dāng)用戶發(fā)起請(qǐng)求的時(shí)候到達(dá)中間件3的process_request之后會(huì)到達(dá)urls路由關(guān)系映射這里,如果匹配到了就會(huì)到中間件1的process_view,然后依次傳遞到中間件3的process_view,到達(dá)view函數(shù)崭歧。如果view函數(shù)中有報(bào)錯(cuò)隅很,則會(huì)從中間件3依次向上判斷每個(gè)中間件的process_exception是否能匹配到這個(gè)錯(cuò)誤信息,如果匹配到則直接返回到最后一個(gè)中間件率碾,這里即中間件3的process_response叔营,然后依次返回到用戶,如果沒(méi)有匹配到這個(gè)錯(cuò)誤則直接在頁(yè)面顯示錯(cuò)誤信息所宰。如果view函數(shù)中沒(méi)有錯(cuò)誤绒尊,則到中間3即最后一個(gè)中間件3的process_response,然后依次向上仔粥,傳到用戶


中間件之process_template_responseprocess
process_template_response(self,request,response)

只有當(dāng)views函數(shù)中返回的對(duì)象中具有render方法婴谱,是就會(huì)直接process_template_responseprocess

轉(zhuǎn)載:https://www.cnblogs.com/zhaof/p/6281541.html
5、常用內(nèi)置中間件:
緩存中間件:
django.middleware.cache.UpdateCacheMiddleware
django.middleware.cache.FetchFromCacheMiddleware
開(kāi)啟全站范圍的緩存躯泰。 如果開(kāi)啟了這些緩存谭羔,任何一個(gè)由Django提供的頁(yè)面將會(huì)被緩存,緩存時(shí)長(zhǎng)在CACHE_MIDDLEWARE_SECONDS中配置定義麦向。

會(huì)話中間件
django.contrib.sessions.middleware.SessionMiddleware
開(kāi)啟會(huì)話支持瘟裸,session支持中間件,加入這個(gè)中間件诵竭,會(huì)在數(shù)據(jù)庫(kù)中生成一個(gè)django_session的表景描。

通用中間件:
django.middleware.common.CommonMiddleware
通用中間件,會(huì)處理一些URL秀撇,比如baidu.com會(huì)自動(dòng)的處理成www.baidu.com超棺。比如/blog/111會(huì)處理成/blog/111/自動(dòng)加上反斜杠。

CSRF保護(hù)中間件
django.middleware.csrf.CsrfViewMiddleware
跨域請(qǐng)求偽造中間件呵燕。加入這個(gè)中間件棠绘,在提交表單的時(shí)候會(huì)必須加入csrf_token,cookie中也會(huì)生成一個(gè)名叫csrftoken的值,也會(huì)在header中加入一個(gè)HTTP_X_CSRFTOKEN的值來(lái)放置CSRF攻擊氧苍。

用戶授權(quán)中間件:
django.contrib.auth.middleware.AuthenticationMiddleware
他會(huì)在每個(gè)HttpRequest對(duì)象到達(dá)view之前添加當(dāng)前登錄用戶的user屬性夜矗,也就是你可以在view中通過(guò)request訪問(wèn)user。

消息中間件
django.contrib.messages.middleware.MessageMiddleware
展示一些后臺(tái)信息給前端頁(yè)面让虐。如果需要用到消息紊撕,還需要在INSTALLED_APPS中添加django.contrib.message才能有效。如果不需要赡突,可以把這兩個(gè)都刪除对扶。

XFrameOptionsMiddleware中間件
django.middleware.clickjacking.XFrameOptionsMiddleware
防止通過(guò)瀏覽器頁(yè)面跨Frame出現(xiàn)clickjacking(欺騙點(diǎn)擊)攻擊出現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惭缰,一起剝皮案震驚了整個(gè)濱河市浪南,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漱受,老刑警劉巖络凿,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昂羡,居然都是意外死亡絮记,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)虐先,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怨愤,“玉大人,你說(shuō)我怎么就攤上這事赴穗。” “怎么了膀息?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵般眉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我潜支,道長(zhǎng)甸赃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任冗酿,我火速辦了婚禮埠对,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裁替。我一直安慰自己项玛,他們只是感情好炭庙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布未桥。 她就那樣靜靜地躺著祖娘,像睡著了一般勿负。 火紅的嫁衣襯著肌膚如雪做鹰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天坏挠,我揣著相機(jī)與錄音冲茸,去河邊找鬼。 笑死固灵,一個(gè)胖子當(dāng)著我的面吹牛捅伤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巫玻,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丛忆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了大审?” 一聲冷哼從身側(cè)響起蘸际,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徒扶,沒(méi)想到半個(gè)月后粮彤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姜骡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年导坟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圈澈。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惫周,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出康栈,到底是詐尸還是另有隱情递递,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布啥么,位于F島的核電站登舞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悬荣。R本人自食惡果不足惜菠秒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氯迂。 院中可真熱鬧践叠,春花似錦、人聲如沸嚼蚀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轿曙。三九已至匾二,卻和暖如春哮独,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背察藐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工皮璧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人分飞。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓悴务,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親譬猫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讯檐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 中間件是一個(gè)鉤子框架,它們可以介入Django 的請(qǐng)求和響應(yīng)處理過(guò)程染服。它是一個(gè)輕量級(jí)别洪、底層的“插件”系統(tǒng),用于在全...
    低吟淺唱1990閱讀 514評(píng)論 0 0
  • 參考:django中間件官方文檔:https://docs.djangoproject.com/en/dev/to...
    發(fā)熱的小火爐閱讀 1,889評(píng)論 0 2
  • 中間件 中間件介紹 什么是中間件 官方的說(shuō)法是:中間件是一個(gè)用來(lái)處理Django的請(qǐng)求和相應(yīng)的框架級(jí)別的鉤子柳刮。他是...
    可笑的黑耀斑閱讀 377評(píng)論 0 0
  • 什么是中間件 官方的說(shuō)法:中間件是一個(gè)用來(lái)處理Django的請(qǐng)求和響應(yīng)的框架級(jí)別的鉤子挖垛。它是一個(gè)輕量、低級(jí)別的插件...
    Pope_Li閱讀 379評(píng)論 0 0
  • 中間件 什么是中間件 中間件就是一個(gè)用來(lái)全局的處理請(qǐng)求和響應(yīng)的框架級(jí)別的鉤子.它本質(zhì)上是一個(gè)類.說(shuō)的直白一點(diǎn)就是中...
    莫辜負(fù)自己的一世韶光閱讀 497評(píng)論 0 1