Django 框架之 中間件

知識點

  1. 概念
  2. 使用場景
  3. 中間件如何發(fā)生作用
  4. 自定義中間件

中間件概念

中間件是嵌入 django 的 request/response 處理過程的一套鉤子框架次慢。它是一個輕量級的底層嵌入系統(tǒng)翻斟,可以對 django 的輸入輸出做整體的修改。

使用場景

如果你想修改請求憔恳,例如被傳送到view中的HttpRequest對象。 或者你想修改view返回的HttpResponse對象读第,這些都可以通過中間件來實現(xiàn)昧诱。
可能你還想在view執(zhí)行之前做一些操作畔塔,這種情況就可以用 middleware來實現(xiàn)潭辈。
比如我們寫一個判斷瀏覽器來源,是pc還是手機澈吨,這里手機我們采用iphone把敢,因為暫時沒有其他設(shè)備。我們有不想把這個邏輯加到視圖函數(shù)里谅辣,想作為一個通用服務(wù)修赞,作為一個可插拔的組件被使用,最好的方法就是實現(xiàn)為中間件。

中間件作用流程

Django中間件必須是一個類柏副,不需要繼承任何類勾邦,并實現(xiàn)四個接口:

  1. process_request(self, request)該方法在請求到來的時候調(diào)用。
  2. process_view(self ,request, fnc , arg ,kwarg)在本次將要執(zhí)行的View函數(shù)被調(diào)用前調(diào)用本函數(shù)割择。
  3. process_response(self,request,response)在執(zhí)行完View函數(shù)準(zhǔn)備將響應(yīng)發(fā)到客戶端前被執(zhí)行眷篇。
  4. process_exception(self,request, exception). View函數(shù)在拋出異常時該函數(shù)被調(diào)用,得到的exception參數(shù)是實際上拋出的異常實例荔泳。通過此方法可以進(jìn)行很好的錯誤控制蕉饼,提供友好的用戶界面。

中間件如何發(fā)生作用

要激活中間件玛歌,需要把它添加到Django 配置文件中的MIDDLEWARE_CLASSES 元組中昧港。

參考文檔

代碼地址:Spareibs的Github

實驗操作

獲取當(dāng)前訪問的客戶端系統(tǒng)信息

【middleware.py】

class CheckSoureMiddware(object):
    def process_request(self, request):
        from_source = request.META['HTTP_USER_AGENT']
        print('from_source ',from_source)
        if 'iPhone' in from_source:
            request.session['from_source'] = 'iphone'
        else:
            request.session['from_source'] = 'pc'

    def process_response(self, request, response):
        res = 'hehe'
        print(res)
        return HttpResponse(res)

【views.py】

from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
    res = 'hi, friend! where a u from?'
    from_source = request.session.get('from_source', 'unkown')
    res = 'hi, friend! u come from %s' %from_source
    return HttpResponse(res)

【settings.py】

MIDDLEWARE_CLASSES = [
    'example.middleware.CheckSoureMiddware',
]

獲取當(dāng)前訪問的客戶端的IP

【middleware.py】

from django.http import HttpResponse

class ForbidSomeIpMiddleware(object):
    def process_request(self, request):
        allow_ip = ['127.0.0.1',]
        ip = request.META['REMOTE_ADDR']
        print('ip ', ip)
        if ip in allow_ip:
            print('ip not allowed')
            return HttpResponse('ip not allowed')

    def process_response(self, request, response):
        res = 'haha'
        print(res)
        return HttpResponse(res)

【settings.py】

MIDDLEWARE_CLASSES = [
    'example.middleware.ForbidSomeIpMiddleware',
]

結(jié)論

先注冊的中間件先被調(diào)用(可以使用process_response來查看)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市支子,隨后出現(xiàn)的幾起案子创肥,更是在濱河造成了極大的恐慌,老刑警劉巖值朋,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓤的,死亡現(xiàn)場離奇詭異,居然都是意外死亡吞歼,警方通過查閱死者的電腦和手機圈膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篙骡,“玉大人稽坤,你說我怎么就攤上這事∨此祝” “怎么了尿褪?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長得湘。 經(jīng)常有香客問我杖玲,道長,這世上最難降的妖魔是什么淘正? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任摆马,我火速辦了婚禮,結(jié)果婚禮上鸿吆,老公的妹妹穿的比我還像新娘囤采。我一直安慰自己,他們只是感情好惩淳,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布蕉毯。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪代虾。 梳的紋絲不亂的頭發(fā)上进肯,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音棉磨,去河邊找鬼坷澡。 笑死,一個胖子當(dāng)著我的面吹牛含蓉,可吹牛的內(nèi)容都是我干的频敛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馅扣,長吁一口氣:“原來是場噩夢啊……” “哼斟赚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起差油,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拗军,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓄喇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體发侵,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年妆偏,在試婚紗的時候發(fā)現(xiàn)自己被綠了刃鳄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡钱骂,死狀恐怖叔锐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情见秽,我是刑警寧澤愉烙,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站解取,受9級特大地震影響步责,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禀苦,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一蔓肯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伦忠,春花似錦省核、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赋咽,卻和暖如春旧噪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脓匿。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工淘钟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陪毡。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓米母,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毡琉。 傳聞我的和親對象是個殘疾皇子铁瞒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • Refer to: www.threemeal.com/blog/12/ 中間件 中間件是一個鉤子框架,它們可以介...
    蘭山小亭閱讀 16,493評論 9 165
  • 中間件是一個鉤子框架桅滋,它們可以介入Django 的請求和響應(yīng)處理過程慧耍。它是一個輕量級、底層的“插件”系統(tǒng)丐谋,用于在全...
    低吟淺唱1990閱讀 516評論 0 0
  • Django 文檔協(xié)作翻譯小組人手緊缺芍碧,有興趣的朋友可以加入我們,完全公益性質(zhì)号俐。交流群:467338606網(wǎng)站:h...
    布客飛龍閱讀 782評論 0 37
  • Django中的中間件是一個輕量級泌豆、底層的插件系統(tǒng),可以介入Django的請求和響應(yīng)處理過程吏饿,修改Django的輸...
    mlj0503閱讀 418評論 0 0
  • 此段內(nèi)容簡要來自自強學(xué)堂的教程詳情請查詢自強學(xué)堂 一践美、 后臺的運作流程 接收request請求 處理數(shù)據(jù) 獲取請求...
    coder_ben閱讀 5,246評論 6 56