詳解Python的Django框架中的中間件
什么是中間件
我們從一個(gè)簡單的例子開始。
高流量的站點(diǎn)通常需要將Django部署在負(fù)載平衡proxy之后。 這種方式將帶來一些復(fù)雜性,其一就是每個(gè)request中的遠(yuǎn)程IP地址(request.META["REMOTE_IP"])將指向該負(fù)載平衡proxy,而不是發(fā)起這個(gè)request的實(shí)際IP。 負(fù)載平衡proxy處理這個(gè)問題的方法在特殊的 X-Forwarded-For 中設(shè)置實(shí)際發(fā)起請(qǐng)求的IP。
因此,需要一個(gè)小小的中間件來確保運(yùn)行在proxy之后的站點(diǎn)也能夠在 request.META["REMOTE_ADDR"] 中得到正確的IP地址:
class SetRemoteAddrFromForwardedFor(object):
def process_request(self, request):
try:
real_ip = request.META['HTTP_X_FORWARDED_FOR']
except KeyError:
pass
else:
# HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.
# Take just the first one.
real_ip = real_ip.split(",")[0]
request.META['REMOTE_ADDR'] = real_ip
(Note: Although the HTTP header is called X-Forwarded-For , Django makes it available as request.META['HTTP_X_FORWARDED_FOR'] . With the exception of content-length and content-type , any HTTP headers in the request are converted to request.META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name.)
一旦安裝了該中間件(參見下一節(jié)),每個(gè)request中的 X-Forwarded-For 值都會(huì)被自動(dòng)插入到 request.META['REMOTE_ADDR'] 中。這樣,Django應(yīng)用就不需要關(guān)心自己是否位于負(fù)載平衡proxy之后;簡單讀取 request.META['REMOTE_ADDR'] 的方式在是否有proxy的情形下都將正常工作。
實(shí)際上,為針對(duì)這個(gè)非常常見的情形,Django已將該中間件內(nèi)置。 它位于 django.middleware.http 中, 下一節(jié)將給出這個(gè)中間件相關(guān)的更多細(xì)節(jié)。
安裝中間件
要啟用一個(gè)中間件,只需將其添加到配置模塊的 MIDDLEWARE_CLASSES 元組中。 在 MIDDLEWARE_CLASSES 中,中間件組件用字符串表示: 指向中間件類名的完整Python路徑。 例如,下面是 django-admin.py startproject 創(chuàng)建的缺省 MIDDLEWARE_CLASSES :
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', )
Django項(xiàng)目的安裝并不強(qiáng)制要求任何中間件,如果你愿意, MIDDLEWARE_CLASSES 可以為空。
這里中間件出現(xiàn)的順序非常重要。 在request和view的處理階段,Django按照 MIDDLEWARE_CLASSES 中出現(xiàn)的順序來應(yīng)用中間件,而在response和異常處理階段,Django則按逆序來調(diào)用它們。 也就是說,Django將 MIDDLEWARE_CLASSES 視為view函數(shù)外層的順序包裝子: 在request階段按順序從上到下穿過,而在response則反過來。
相關(guān)文章
Python requests HTTP驗(yàn)證登錄實(shí)現(xiàn)流程
這篇文章主要介紹了Python requests HTTP驗(yàn)證登錄實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python多進(jìn)程方式抓取基金網(wǎng)站內(nèi)容的方法分析
這篇文章主要介紹了Python多進(jìn)程方式抓取基金網(wǎng)站內(nèi)容的方法,結(jié)合實(shí)例形式分析了Python多進(jìn)程抓取網(wǎng)站內(nèi)容相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-06-06
Django 實(shí)現(xiàn)對(duì)已存在的model進(jìn)行更改
這篇文章主要介紹了Django 實(shí)現(xiàn)對(duì)已存在的model進(jìn)行更改,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
淺談Python實(shí)現(xiàn)貪心算法與活動(dòng)安排問題
本篇文章主要介紹了淺談Python實(shí)現(xiàn)貪心算法與活動(dòng)安排問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例
這篇文章主要介紹了將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例,盡管通常還是Python代碼中調(diào)用C++程序的情況較多...需要的朋友可以參考下2015-07-07

