Django中間件

創(chuàng)建middleware.py文件

方法一:

---> middleware.py
import json
from django.utils.deprecation import MiddlewareMixin


class ReturnUserMiddleware(MiddlewareMixin):

    def process_response(self, request, response):
        # 只處理自定義視圖響應, 繞開Django第三方工具不分離模式響應
        if isinstance(response.data, (dict, list, str, float, int)):
            response.data = {'result': response.data}
            response.data['user'] = request.user.username
            
            # content才是WSGI構建響應報文時的響應體.
            response.content = json.dumps(response.data)

        return response

---> settings.py
MIDDLEWARE = [
    ...
    'utils.middleware.ReturnUserMiddleware',
]
# 添加中間件前
[
    {
        "id": 4,
        "btitle": "射雕英雄傳",
        "bpub_date": "1980-05-01",
        "bread": 12,
        "bcomment": 34,
        "is_delete": false,
        "create_time": "2020-12-03T11:26:00+08:00",
        "update_time": "2020-12-03T11:26:00+08:00"
    },
    {
        "id": 5,
        "btitle": "天龍八部",
        "bpub_date": "1986-07-24",
        "bread": 36,
        "bcomment": 40,
        "is_delete": false,
        "create_time": "2020-12-03T11:26:00+08:00",
        "update_time": "2020-12-03T11:26:00+08:00"
    }
]

# 添加中間件后
{
    "result": [
        {
            "id": 4,
            "btitle": "射雕英雄傳",
            "bpub_date": "1980-05-01",
            "bread": 12,
            "bcomment": 34,
            "is_delete": false,
            "create_time": "2020-12-03T11:26:00+08:00",
            "update_time": "2020-12-03T11:26:00+08:00"
        },
        {
            "id": 5,
            "btitle": "天龍八部",
            "bpub_date": "1986-07-24",
            "bread": 36,
            "bcomment": 40,
            "is_delete": false,
            "create_time": "2020-12-03T11:26:00+08:00",
            "update_time": "2020-12-03T11:26:00+08:00"
        }
    ],
    "user": "xiaoming"
}


方法二:

----摘自"黑馬程序員"

學習目標:

知道什么是中間件

掌握中間件的調用順序

什么是中間件:

  • Django 的中間件是一個輕量級谆奥、底層的插件系統(tǒng)透硝,可以介入請求和響應處理過程,修改 Django 的輸入或輸出.
  • 中間件的設計為開發(fā)者提供了一種無侵入式的開發(fā)方式喳整,增強了 Django 框架的健壯性坞生。
  • 我們可以使用中間件,在 Django 視圖的不同階段對輸入或輸出進行處理.

中間件的定義方法

定義一個中間件工廠函數(shù)责嚷,然后返回一個可以被調用的中間件痕支。

中間件工廠函數(shù)需要接收一個可以調用的 get_response 對象。

返回的中間件也是一個可以被調用的對象芒澜,并且像視圖一樣需要接收一個 request 對象參數(shù)仰剿,返回一個 response 對象。

def simple_middleware(get_response):
    # 此處編寫的代碼僅在 Django 第一次配置和初始化的時候執(zhí)行一次痴晦。

    def middleware(request):

        # 此處編寫的代碼會在每個請求處理視圖前被調用酥馍。

        response = get_response(request)

        # 此處編寫的代碼會在每個請求處理視圖之后被調用。

        return response

    return middleware

例如阅酪,在 users 應用中新建一個 middleware.py 文件旨袒,

def my_middleware(get_response):

    print('init 被調用')

    def middleware(request):

        print('before request 被調用')

        response = get_response(request)

        print('after response 被調用')

        return response
    return middleware

定義好中間件后,需要在 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',
     # 添加中間件
    'users.middleware.my_middleware',  
]

定義一個視圖進行測試

def demo_view(request):
    print('view 視圖被調用')
    return HttpResponse('OK')

執(zhí)行結果


middleware_demo.png

注意:Django 運行在調試模式下术辐,中間件 init 部分有可能被調用兩次砚尽。

多個中間件的執(zhí)行順序

  • 在請求視圖被處理,中間件由上至下依次執(zhí)行
  • 在請求視圖被處理辉词,中間件由下至上依次執(zhí)行
示例:

定義兩個中間件

def my_middleware(get_response):
    print('init 被調用')
    def middleware(request):
        print('before request 被調用')
        response = get_response(request)
        print('after response 被調用')
        return response
    return middleware

def my_middleware2(get_response):
    print('init2 被調用')
    def middleware(request):
        print('before request 2 被調用')
        response = get_response(request)
        print('after response 2 被調用')
        return response
    return middleware

注冊添加兩個中間件

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',
    'users.middleware.my_middleware',  # 添加
    'users.middleware.my_middleware2',  # 添加
]
執(zhí)行結果
init2 被調用
init 被調用
before request 被調用
before request 2 被調用
view 視圖被調用
after response 2 被調用
after response 被調用
視圖前后的執(zhí)行流程
middleware_sequence.png
中間件執(zhí)行流程.png

總結:

  • 中間件一般會現(xiàn)在一個單獨的文件之中
  • 中間件函數(shù)定義好后, 可以獲取三個空間用于添加代碼
    • 項目初始化的時候會調用的空間
    • 在調用視圖函數(shù)之前會調用的空間
    • 在調用視圖函數(shù)之后會調用的空間
  • 使用中間件之前需要在 settings.py 的 MIDDLEWARE 模塊中注冊.
  • 中間件調用的順序需要注意.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末必孤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敷搪,老刑警劉巖兴想,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赡勘,居然都是意外死亡嫂便,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門闸与,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毙替,“玉大人,你說我怎么就攤上這事践樱〕Щ” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵拷邢,是天一觀的道長袱院。 經(jīng)常有香客問我,道長瞭稼,這世上最難降的妖魔是什么忽洛? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮弛姜,結果婚禮上脐瑰,老公的妹妹穿的比我還像新娘妖枚。我一直安慰自己廷臼,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布绝页。 她就那樣靜靜地躺著荠商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪续誉。 梳的紋絲不亂的頭發(fā)上莱没,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音酷鸦,去河邊找鬼饰躲。 笑死,一個胖子當著我的面吹牛臼隔,可吹牛的內容都是我干的嘹裂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼摔握,長吁一口氣:“原來是場噩夢啊……” “哼寄狼!你這毒婦竟也來了?” 一聲冷哼從身側響起氨淌,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤泊愧,失蹤者是張志新(化名)和其女友劉穎伊磺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體删咱,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屑埋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腋腮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雀彼。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖即寡,靈堂內的尸體忽然破棺而出徊哑,到底是詐尸還是另有隱情,我是刑警寧澤聪富,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布莺丑,位于F島的核電站,受9級特大地震影響墩蔓,放射性物質發(fā)生泄漏梢莽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一奸披、第九天 我趴在偏房一處隱蔽的房頂上張望昏名。 院中可真熱鬧,春花似錦阵面、人聲如沸轻局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仑扑。三九已至,卻和暖如春置鼻,著一層夾襖步出監(jiān)牢的瞬間镇饮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工箕母, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留储藐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓嘶是,卻偏偏與公主長得像钙勃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俊啼,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348