好男人天堂网,久久精品国产这里是免费,国产精品成人一区二区,男人天堂网2021,男人的天堂在线观看,丁香六月综合激情

當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > 翻譯www.djangobook.com之第十六章:中間件

翻譯www.djangobook.com之第十六章:中間件
2010-01-13 23:43:58  作者:  來(lái)源:
有時(shí)你需要對(duì)每個(gè)Django處理的請(qǐng)求運(yùn)行一段代碼,該代碼可能需要在視圖處理它之前修改請(qǐng)求,或者可能日志為了調(diào)試而
記錄關(guān)于請(qǐng)求的信息等等
Django的中間件框架本質(zhì)上是進(jìn)入Django的請(qǐng)求/應(yīng)答處理的鉤子,它是全局改變Django的輸入和輸出的輕量的,低級(jí)的"插
件"系統(tǒng)
每個(gè)中間件組件負(fù)責(zé)一些專有的功能,如果你線性的閱讀本書(shū),則你已經(jīng)看到中間件好幾次了:
1,我們?cè)诘?2章看到的所有俏皮的會(huì)話和用戶工具可能由一些小塊的中間件構(gòu)成(更明確的,中間件使得你在視圖中可以得
到request.session和request.user)
2,第12章討論的站點(diǎn)寬度的緩存事實(shí)上只是一些中間件,如果視圖的應(yīng)答已經(jīng)被緩存則它們是調(diào)用你的視圖方法的捷徑
3,第15章的flatpages,redirects和csrf這些貢獻(xiàn)的apps都是通過(guò)使用中間件組件來(lái)施展它們的魔力
本章深入了解什么是中間件以及它怎樣工作,并解釋了你怎樣寫(xiě)你自己的中間件

什么是中間件?
中間件事實(shí)上難以置信的簡(jiǎn)單,一個(gè)中間件組件是簡(jiǎn)單的遵守某一API的Python類--又是鴨子類型!在深入正式的API之前,讓
我們先來(lái)看看簡(jiǎn)單的例子
高流量的站點(diǎn)通常需要在一個(gè)負(fù)載均衡代理后面部署Django(參考第12章),這會(huì)導(dǎo)致一些小的復(fù)雜性,其中一個(gè)是每個(gè)請(qǐng)求
的遠(yuǎn)程IP(request.META["REMOTE_IP"])將為負(fù)載均衡者的IP,而不是真實(shí)的IP生成的請(qǐng)求,負(fù)載均衡通過(guò)設(shè)置特殊的頭部
X-Forwared-For到真實(shí)的請(qǐng)求IP地址來(lái)處理這些
所以這里是一些中間件讓代理后面運(yùn)行的站點(diǎn)仍然可以在request.META["REMOTE_IP"]看到正確的IP地址:
Java代碼 復(fù)制代碼
  1. class SetRemoteAddrFromForwardedFor(object):   
  2.   
  3.     def process_request(self, request):   
  4.         try:   
  5.             real_ip = request.META['HTTP_X_FORWARDED_FOR']   
  6.         except KeyError:   
  7.             pass   
  8.         else:   
  9.             # HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.   
  10.             # Take just the first one.   
  11.             real_ip = real_ip.split(",")[0]   
  12.             request.META['REMOTE_ADDR'] = real_ip  

如果它被安裝了(參考下面的),每個(gè)請(qǐng)求的X-Forwarded-For值將被自動(dòng)插入到request.META['REMOTE_ADDR'],很簡(jiǎn)單吧?
事實(shí)上,這個(gè)中間件作為Django的內(nèi)建部分是一個(gè)足夠常見(jiàn)的需要,它位于django.middleware.http,你在下面可以看到一
些更多關(guān)于它的內(nèi)容

安裝中間件
線性閱讀的讀者可能已經(jīng)對(duì)此是老手了,如果你已經(jīng)指定怎樣激活中間件則前面的一些章節(jié)中的許多例子將很好的工作
盡管如此,為了完整性考慮--以及為了考慮那些已經(jīng)把本書(shū)的頁(yè)面撕破并攪亂它們并隨機(jī)閱讀它們的Julio Cortázar 迷們
讓我們來(lái)看看它
為了激活中間件組件,把它添加到你的settings模塊的MIDDLEWARE_CLASSES列表中,在MIDDLEWARE_CLASSES里,每個(gè)中間件
組件通過(guò)一個(gè)字符串來(lái)表示:完整的到中間件的類名的Python路徑,例如,這里是通過(guò)django-admin.py startproject創(chuàng)建的
默認(rèn)的MIDDLEWARE_CLASSES:
Java代碼 復(fù)制代碼
  1. MIDDLEWARE_CLASSES = (   
  2.     'django.middleware.common.CommonMiddleware',   
  3.     'django.contrib.sessions.middleware.SessionMiddleware',   
  4.     'django.contrib.auth.middleware.AuthenticationMiddleware',   
  5.     'django.middleware.doc.XViewMiddleware',   
  6. )  

Django安裝部需要任何中間件--例如MIDDLEWARE_CLASSES可以為空,如果你想這樣的話--但是強(qiáng)烈建議你使用CommonMiddle
ware
順序是有意義的,在請(qǐng)求和視圖階段,Django使用MIDDLEWARE_CLASSES給定的順序申請(qǐng)中間件,而在應(yīng)答和異常階段,Djang
o使用相反的順序申請(qǐng)中間件,即Django把MIDDLEWARE_CLASSES當(dāng)作一種視圖方法的"包裝器":在請(qǐng)求時(shí),它自頂向下申請(qǐng)這
個(gè)列表的中間件到視圖,而在應(yīng)答時(shí)它反序進(jìn)行

中間件方法
既然我們知道了什么是中間件和怎樣安裝它,讓我們來(lái)看看中間件類可能定義的所有可得到的方法

初始化:__init__(self)
如果中間件類定義了一個(gè)構(gòu)造方法(即一個(gè)__init__方法),它應(yīng)該不使用參數(shù)(除了標(biāo)準(zhǔn)的slef)
出于性能考慮,中間件類在長(zhǎng)時(shí)間運(yùn)行的服務(wù)器過(guò)程中只初始化一次,這意味著你不能指望每次請(qǐng)求運(yùn)行時(shí)調(diào)用__init__,
只有在服務(wù)器啟動(dòng)時(shí)調(diào)用一次
中間件類可能也使用初始化時(shí)間來(lái)刪除它們本身而不是被安裝,如果初始化時(shí)觸發(fā)django.exceptions.MiddlewareNotUsed異
常,則Django將從中間件堆棧刪除該中間件,你可能使用這點(diǎn)來(lái)檢查中間件類依賴的一些軟件,或者服務(wù)器是否運(yùn)行在調(diào)試
模式下,或者任何其它可能讓你想禁止中間件的類型的環(huán)境

請(qǐng)求預(yù)處理:process_request(self, request)
該方法在請(qǐng)求被接收和URL被解析來(lái)決定運(yùn)行哪個(gè)視圖之前立即調(diào)用,它傳遞你可能想修改的HttpRequest對(duì)象
process_request()應(yīng)該返回None或者HttpResponse對(duì)象,如果它返回None,Django將繼續(xù)處理該請(qǐng)求,執(zhí)行任何其它的中間
件然后是合適的視圖
如果請(qǐng)求中間件返回HttpResponse對(duì)象,Django將不會(huì)再調(diào)用其它任何中間件(任何類型)或者合適的視圖,它將返回該應(yīng)答

視圖預(yù)處理:process_view(self, request, view, args, kwargs)
該方法在請(qǐng)求中間件運(yùn)行后和URL被解析到一個(gè)視圖后和視圖實(shí)際上被調(diào)用之前被調(diào)用
傳遞給該視圖的參數(shù)為:
Argument           Explanation
request            HttpRequest對(duì)象
view               Django將會(huì)調(diào)用來(lái)樹(shù)立該請(qǐng)求的Python方法,它是實(shí)際上的方法對(duì)象本身,而不是方法名字符串
args               將被傳遞給視圖的位置參數(shù)列表,不包括request參數(shù)(它一直是視圖的第一個(gè)參數(shù))
kwargs             將被傳遞給視圖的關(guān)鍵字參數(shù)字典
像process_request()一樣,process_view()應(yīng)該返回None或者HttpResponse對(duì)象,如果它返回None,Django將繼續(xù)處理請(qǐng)求
執(zhí)行任何其它的視圖中間件然后是合適的視圖
如果視圖中間件返回HttpResponse對(duì)象,Django將不會(huì)再調(diào)用其它任何中間件或者合適的視圖,它將返回該應(yīng)答

應(yīng)答后處理:process_response(self, request, response)
該方法再視圖方法已經(jīng)調(diào)用和應(yīng)答生成后調(diào)用,這是中間件修改應(yīng)答輸出的地方,輸出壓縮(見(jiàn)下)是應(yīng)答中間件的一個(gè)顯然
的應(yīng)用
參數(shù)應(yīng)該非常自明了--request是請(qǐng)求對(duì)象,response是從視圖返回的應(yīng)答對(duì)象
不像請(qǐng)求和視圖中間件,它們可以返回None,process_response()必須返回一個(gè)HttpResponse對(duì)象,該應(yīng)答可以是傳遞給該
方法的原始應(yīng)答(可能被修改了)或者新的應(yīng)答

異常后處理:process_exception(self, request, exception)
該方法只在出錯(cuò)并且視圖觸發(fā)不可捕獲的異常時(shí)調(diào)用,不包括Http404異常,你可以使用這個(gè)鉤子來(lái)發(fā)送錯(cuò)誤通知,在一個(gè)日
志文件記錄信息,或者甚至嘗試自動(dòng)恢復(fù)該錯(cuò)誤
該方法的參數(shù)是我們一直處理的同樣的request對(duì)象和視圖方法觸發(fā)的真正的Exception對(duì)象exception
process_exception()可能返回一個(gè)作為應(yīng)答顯示給瀏覽器的HttpResponse或者返回None來(lái)繼續(xù)Django內(nèi)建的異常處理

例子
Django自帶一些中間件類--上面討論了--它們是很好的例子,閱讀它們的代碼應(yīng)該給你中間件的力量的好的感覺(jué)
你也可以在Django的wiki上找到一些社區(qū)貢獻(xiàn)的例子:
http://code.djangoproject.com/wiki/ContributedMiddleware

內(nèi)建的中間件
Django帶有一些內(nèi)建的中間件來(lái)處理常見(jiàn)的問(wèn)題

認(rèn)證支持中間件
中間件類:django.contrib.auth.middleware.AuthenticationMiddleware
運(yùn)行認(rèn)證支持,技術(shù)上,該中間件為每個(gè)進(jìn)來(lái)的HttpRequest對(duì)象添加了表示當(dāng)前登錄的用戶的request.user屬性
參考第15章得到完整的細(xì)節(jié)

"Common"中間件
中間件類:django.middleware.common.CommonMiddleware
為完美主義者添加一些方便:
1,禁止訪問(wèn)在DISALLOWED_USER_AGENTS設(shè)置中的user agents,該設(shè)置應(yīng)該是一個(gè)字符串列表
2,基于APPEND_SLASH和PREPEND_WWW設(shè)置執(zhí)行URL重定向,如果APPEND_SLASH為T(mén)rue,缺少結(jié)尾的斜線的URLs將被重定向到相
同的結(jié)尾有斜線的URL,除非路徑中最后的組件包含一個(gè)小數(shù)點(diǎn),所以foo.com/bar被重定向到foo.com/bar/,但是foo.com/
bar/file.txt會(huì)無(wú)更改的傳遞
如果PREPEND_WWW為T(mén)rue,缺少開(kāi)頭的"www."的URLs將被重定向到相同的有開(kāi)頭的"www."的URL
這些選項(xiàng)都意味著規(guī)范化URLs,哲學(xué)是每個(gè)URL應(yīng)該應(yīng)該存在于一個(gè)并且只有一個(gè)地方,技術(shù)上URL foo.com/bar和foo.com/
bar/不同--搜索引擎索引器將把它們視為不同的URLs,所以規(guī)范化URLs是最佳實(shí)踐
3,基于USE_ETAGS設(shè)置處理ETags,如果USE_ETAGS設(shè)置為T(mén)rue,Django將通過(guò)MD5-哈希頁(yè)面內(nèi)容為每個(gè)請(qǐng)求計(jì)算Etag,并且
如果合適的話它將注意發(fā)送未修改的應(yīng)答

壓縮中間件
中間件類:django.middleware.gzip.GZipMiddleware
如果被激活,該中間件將為理解gzip壓縮的瀏覽器(所有的現(xiàn)代瀏覽器)自動(dòng)壓縮內(nèi)容
這可以以處理時(shí)間為代價(jià)很大的減少web服務(wù)器消耗的帶寬數(shù)量,我們通常選擇速度而不是帶寬,但是如果你想使用相反的一
邊,只需激活該中間件

有條件的GET中間件
中間件類:django.middleware.http.ConditionalGetMiddleware
如果被激活,它提供有條件的GET操作支持,如果應(yīng)答有一個(gè)ETag或者Last-Modified頭部,并請(qǐng)求有If-None-Match或者If-
Modified-Since,應(yīng)答將被304("未修改")應(yīng)答替換
它也為所有請(qǐng)求刪除任何應(yīng)答到HEAD請(qǐng)求的內(nèi)容并設(shè)置Date和Content-Length應(yīng)答頭部

倒轉(zhuǎn)代理支持(X-Forwarede-For中間件)
中間件類:django.middleware.http.SetRemoteAddrFromForwaredFor
則是我們上面看到的例子,它基于request.META['HTTP_X_FORWARDED_FOR']設(shè)置request.META['REMOTE_ADDR'],如果前者
設(shè)置了的話,這當(dāng)你位于將每個(gè)請(qǐng)求的REMOTE_ADDR設(shè)置為127.0.0.1的倒轉(zhuǎn)代理后面時(shí)很有用
危險(xiǎn),Will Robinson!
它不驗(yàn)證HTTP_X_FORWARDED_FOR
如果你沒(méi)有在自動(dòng)設(shè)置HTTP_X_FORWARDED_FOR的倒轉(zhuǎn)代理后面,則不要使用該中間件,任何人都可以欺騙HTTP_X_FORWARDED_
FOR的值,由于它基于HTTP_X_FORWARDED_FOR設(shè)置REMOTE_ADDR,這意味著任何人可以偽造他們的IP地址
只有當(dāng)你可以絕對(duì)信任HTTP_X_FORWARDED_FOR的值時(shí)使用該中間件

Session支持中間件
中間件類:django.contrib.sessions.middleware.SessionMiddleware
允許session支持,參考第15章的細(xì)節(jié)

站點(diǎn)寬度緩存中間件
中間件類:django.middleware.cache.CacheMiddleware
如果被激活,每個(gè)Django驅(qū)動(dòng)的頁(yè)面將被緩存,這在第14章詳細(xì)討論了

事務(wù)中間件
中間件類:django.middleware.transaction.TransactionMiddleware
在請(qǐng)求/應(yīng)答階段綁定數(shù)據(jù)庫(kù)COMMIT或者ROLLBACK,如果視圖方法成功運(yùn)行,則COMMIT完成,如果它以異常失敗,則ROLLBACK
完成
在堆棧中該中間件的順序很重要:運(yùn)行在它外面的中間件模塊以Django默認(rèn)行為commit-on-save運(yùn)行,運(yùn)行在它里面(在堆棧
中它后面)的中間件模塊將和視圖方法處于同一事務(wù)控制
參考XXX來(lái)得到更多關(guān)于數(shù)據(jù)庫(kù)事務(wù)的信息

"X-View"中間件
中間件類:django.middleware.doc.XViewMiddleware
對(duì)來(lái)自INTERNAL_IPS設(shè)置中定義的IP地址的HEAD請(qǐng)求發(fā)送自定義X-View HTTP頭部,它被Django的自動(dòng)文檔系統(tǒng)使用
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
国产麻豆精品视频| 在线观看成人网| 台湾毛片| 一级毛片视频播放| 成人免费观看视频| 午夜激情视频在线观看| 日韩在线观看视频网站| 台湾毛片| 尤物视频网站在线| 欧美一级视| 免费国产一级特黄aa大片在线| 国产麻豆精品hdvideoss| 国产视频一区在线| 韩国三级视频网站| 可以免费在线看黄的网站| 精品久久久久久中文字幕2017| 一 级 黄 中国色 片| 成人影视在线观看| 精品国产一区二区三区久久久蜜臀 | 一级女性全黄生活片免费| 黄视频网站免费看| 久久福利影视| 欧美激情一区二区三区在线播放 | 国产成人啪精品视频免费软件| 国产一区二区精品久久91| 欧美一区二区三区在线观看| 国产高清在线精品一区二区| 国产伦精品一区二区三区无广告 | 欧美激情影院| 香蕉视频亚洲一级| 欧美大片a一级毛片视频| 久久99中文字幕| 国产极品精频在线观看| 99久久精品国产高清一区二区| 四虎影视久久久| 欧美18性精品| 欧美一级视| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩中文字幕在线观看视频| 日本免费乱理伦片在线观看2018| 可以免费看污视频的网站| 色综合久久天天综线观看| 午夜在线亚洲| 亚洲精品久久久中文字| 日韩专区一区| 欧美另类videosbestsex久久 | 成人a大片在线观看| 成人影院一区二区三区| 免费毛片基地| 免费毛片基地| 日韩一级黄色片| 亚洲第一视频在线播放| 一级毛片看真人在线视频| 欧美大片毛片aaa免费看| 久久久成人影院| 韩国三级香港三级日本三级| 免费一级片在线| 四虎久久精品国产| 日韩在线观看视频免费| 国产91精品一区| 精品视频一区二区三区免费| 91麻豆tv| 国产成a人片在线观看视频| 国产一区二区精品久久91| 中文字幕一区二区三区 精品| 精品国产香蕉在线播出| 国产视频网站在线观看| 青草国产在线观看| 精品国产三级a| 国产一区二区福利久久| 国产一区二区精品在线观看| 九九久久99| 一a一级片| 九九久久国产精品| 高清一级淫片a级中文字幕| 日韩专区亚洲综合久久| 国产视频一区在线| 国产91精品露脸国语对白| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 色综合久久天天综合观看| 美女免费精品视频在线观看| 国产精品1024在线永久免费| 久久久成人影院| 成人影视在线观看| 91麻豆精品国产自产在线| 欧美日本免费| 精品国产香蕉在线播出| 天天做日日干| 日本在线不卡视频| 四虎影视库| 精品视频在线观看一区二区三区| 韩国毛片| 99热精品一区| 精品国产一区二区三区久久久蜜臀 | 国产美女在线一区二区三区| 亚洲 激情| 日韩一级黄色大片| 精品视频在线观看免费| 亚洲精品永久一区| 久久久久久久网| 日韩专区一区| 四虎影视久久久免费| 午夜精品国产自在现线拍| 国产成人啪精品| 韩国毛片免费大片| 午夜精品国产自在现线拍| 黄视频网站在线看| 精品国产一区二区三区国产馆| 精品视频在线看 | 国产网站在线| 日韩在线观看免费| 99色视频| 亚飞与亚基在线观看| 欧美激情一区二区三区在线播放| 一级女性全黄久久生活片| 一级女性全黄久久生活片| 99热精品在线| 国产一级强片在线观看| 尤物视频网站在线观看| 99热精品一区| 一级女性全黄久久生活片| 国产高清在线精品一区a| 欧美a级片视频| 久久福利影视| 亚欧视频在线| 成人免费福利片在线观看| 国产一区二区精品| 日本免费乱理伦片在线观看2018| 九九九网站| 黄色福利| 可以在线看黄的网站| 国产麻豆精品视频| 免费一级片在线| 日本特黄特色aaa大片免费| 亚洲第一页乱| 国产成人精品一区二区视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久国产影院| 午夜在线影院| 久久国产精品自线拍免费| 欧美α片无限看在线观看免费| 国产原创中文字幕| 国产高清在线精品一区二区| 日韩一级黄色大片| 成人免费观看的视频黄页| 日韩专区第一页| 91麻豆国产| 国产伦精品一区二区三区无广告 | 黄视频网站免费观看| 欧美日本二区| 亚洲第一页乱| 黄视频网站在线免费观看| 亚洲 国产精品 日韩| 国产一区二区精品久久91| 一级女性全黄生活片免费| 九九九国产| 尤物视频网站在线| 久草免费资源| 亚欧成人乱码一区二区| 欧美另类videosbestsex视频| 四虎影视库| 美女免费毛片| 欧美一级视频高清片| 日韩中文字幕一区| 99色视频在线观看| 欧美一级视| 四虎久久影院| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 午夜在线影院| a级毛片免费全部播放| 一级毛片视频免费| 成人免费观看的视频黄页| 国产亚洲精品成人a在线| 日日爽天天| 亚洲精品中文字幕久久久久久| 毛片的网站| 一 级 黄 中国色 片| 精品视频在线观看一区二区| 久久久久久久网| 夜夜操网| 国产亚洲免费观看| 精品国产一区二区三区国产馆| 尤物视频网站在线观看| 国产一区二区高清视频| 97视频免费在线观看| 美女免费毛片| 免费国产在线观看不卡| 免费一级片在线观看| 999久久66久6只有精品| 亚洲精品中文一区不卡| 一级片片| 精品国产一区二区三区久久久狼| 国产a视频精品免费观看| 精品国产一区二区三区久久久蜜臀 | 四虎影视久久久| 国产麻豆精品| 九九热国产视频| 二级片在线观看| 国产美女在线观看| 欧美1区|