最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Django的中間件middleware

 更新時(shí)間:2018年03月14日 11:06:40   作者:我的胡子有點(diǎn)扎  
這篇文章主要給大家介紹了關(guān)于Django中的中間件middleware的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

本文講述的內(nèi)容基于 Django 1.11

摘要

Django 中的中間件(middleware),是一個(gè)鑲嵌到Django的request/response處理機(jī)制中的一個(gè)hooks框架,是一個(gè)修改django全局輸入輸出的一個(gè)底層插件系統(tǒng)。讓我們可以自定義想要的一些功能來(lái)處理用戶的請(qǐng)求。

在Django中,中間件其實(shí)就是一個(gè)類(lèi),在類(lèi)中包含一組特定的功能,在請(qǐng)求到來(lái)或者結(jié)束時(shí),Django會(huì)根據(jù)我們定義的中間件規(guī)則執(zhí)行中間件中對(duì)應(yīng)的方法,一個(gè) Django 項(xiàng)目默認(rèn)激活的中間件在我們項(xiàng)目中的配置中可以看到是這個(gè)樣子的:

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',
]

MIDDLEWARE這里列表中的每一個(gè)元素,其實(shí)就是一個(gè)個(gè)單獨(dú)的中間件,舉例來(lái)說(shuō):django.middleware.csrf.CsrfViewMiddleware這個(gè)中間件,作用就是在我們的 form 表單提交請(qǐng)求的時(shí)候,提交的時(shí)候必須要帶上csrf_token,否則就不會(huì)正確提交。

中間件使用也需要講究順序,下一層依賴上一層的封裝,例如,我們的AuthenticationMiddleware是一個(gè)認(rèn)證中間件,在session 中保存認(rèn)證用戶的信息,但是他必須依賴于SessionMiddleware才可以被正確使用,所以他也必須在SessionMiddleware之后。但是具體的順序問(wèn)題可以參考這里

中間件結(jié)構(gòu)

中間件類(lèi)中需要包含以下處理方法:

1. process_request(self, request)
2. process_view(self, request, callback, callback_args, callback_kwargs)
3. process_template_response(self, request, response)
4. process_exception(self, request, exception)
5. process_response(self, request, response)

執(zhí)行過(guò)程

以我們的項(xiàng)目中默認(rèn)中間件為例子,具體的流程如下所示:

中間件執(zhí)行前提

中間件要按照一定的順序一層一層的執(zhí)行下去,需要按照標(biāo)準(zhǔn)返回特定的內(nèi)容:

  • 如果為 None,則按照順序繼續(xù)向下執(zhí)行
  • 如果為 HttpResonse 對(duì)象,則直接將這個(gè)對(duì)象返回給用戶

此處有一個(gè)版本前后的區(qū)別,請(qǐng)大家注意區(qū)分:

在 Django1.10之后, 當(dāng)某個(gè)中間件,例如CsrfViewMiddleware請(qǐng)求process_request沒(méi)有返回 None 后,這個(gè)請(qǐng)求會(huì)交給CsrfViewMiddleware的process_response來(lái)返回,即返回給相同一層的中間件來(lái)返回:

在 Django1.10之前的版本,會(huì)返回到最底層的中間件來(lái)返回:

中間件方法:

1、process_request(self, request)

其中request參數(shù)就是我們的HttpRequest對(duì)象,process_request 會(huì)在每個(gè)request在被決定使用哪個(gè)view之前調(diào)用,它會(huì)返回None或HttpResponse對(duì)象

2、process_view(self, request, callback, callback_args, callback_kwargs)

其中request參數(shù)就是的HttpRequest對(duì)象,callback 就是請(qǐng)求被決定使用的 view 函數(shù),書(shū)具體的函數(shù)名,不是字符串類(lèi)型。callback_args和callback_kwargs是 view 函數(shù)需要接受的參數(shù),它會(huì)返回None或HttpResponse對(duì)象

3、process_template_response(self, request, response)

其中request 是 HttpRequest 對(duì)象, response 是一個(gè)由Django view或者中間件返回的TemplateResponse 對(duì)象,process_template_response()在 view 使用 render 渲染一個(gè)模版對(duì)象完成之后被調(diào)用,它必須返回一個(gè)render 方法執(zhí)行后的response對(duì)象。

4、process_exception(self, request, exception)

其中request參數(shù)就是的HttpRequest對(duì)象,exception是view函數(shù)中raise的Exception對(duì)象,當(dāng) view 函數(shù) raise 一個(gè) exception 的時(shí)候調(diào)用process_exception,它會(huì)返回None或HttpResponse對(duì)象

5、process_response(self, request, response)

其中request是 HttpRequest 對(duì)象,response 是一個(gè)django view或者中間件返回的 HttpResponse 或者StreamingHttpResponse對(duì)象,process_response會(huì)在所有響應(yīng)到達(dá)瀏覽器之前被調(diào)用

中間件的詳細(xì)執(zhí)行流程

由于process_template_response在特定的 rander 渲染中才會(huì)被調(diào)用,所以過(guò)程中不添加該方法

自建中間件與執(zhí)行過(guò)程測(cè)試

為了更加清晰的展示中間件的執(zhí)行過(guò)程與如何自定義一個(gè)中間件,我們模擬一個(gè)簡(jiǎn)單的用戶請(qǐng)求和中間件執(zhí)行過(guò)程:

自定義中間件

from django.utils.deprecation import MiddlewareMixin
class MyMiddleware_1(MiddlewareMixin):
 def process_request(self, request):
  print("自定義 process_request 1")
  return None

 def process_response(self, request, response):
  print("自定義 process_response 1")
  return response

 def process_view(self, request, callback, callback_args, callback_kwargs):
  print("自定義 process_view 1")
  return None

 def process_exception(self, request, exception):
  print("自定義 process_exception 1")


class MyMiddleware_2(MiddlewareMixin):

 def process_request(self, request):
  print("自定義 process_request 2")
  return None

 def process_response(self, request, response):
  print("自定義 process_response 2")
  return response

 def process_view(self, request, callback, callback_args, callback_kwargs):
  print("自定義 process_view 2")
  return None

 def process_exception(self, request, exception):
  print("自定義 process_exception 2")

引入

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',
 'app01.middle_by_me.MyMiddleware_1', # 第一個(gè)自定義 middleware
 'app01.middle_by_me.MyMiddleware_2' # 第二個(gè)自定義 middleware
]

輸出結(jié)果

自定義中間件應(yīng)用場(chǎng)景

應(yīng)用場(chǎng)景這個(gè)問(wèn)題其實(shí)不是很好去固定,因?yàn)榇蠹以趯?shí)際使用過(guò)程中的需求都不盡相同,所以我簡(jiǎn)單的舉個(gè)我可以想到的例子吧。

在不修改業(yè)務(wù)邏輯源代碼的情況下,我可以使用中間件來(lái)對(duì)用戶的訪問(wèn)進(jìn)行一定的篩選過(guò)濾,或者訪問(wèn)控制。還有能想到的更加牛逼的操作是當(dāng)源站的 CDN,請(qǐng)求穿透源站,middleware 判斷請(qǐng)求的內(nèi)容是否在緩存中,如果在緩存直接返回,而可以不經(jīng)過(guò)業(yè)務(wù)后端邏輯,是不是很騷~

是不是很像一個(gè)所有視圖函數(shù)的裝飾器~~

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Sanic框架流式傳輸操作示例

    Sanic框架流式傳輸操作示例

    這篇文章主要介紹了Sanic框架流式傳輸操作,結(jié)合實(shí)例形式分析了Sanic通過(guò)流請(qǐng)求與響應(yīng)傳輸操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • python科學(xué)計(jì)算之scipy——optimize用法

    python科學(xué)計(jì)算之scipy——optimize用法

    今天小編就為大家分享一篇python科學(xué)計(jì)算之scipy——optimize用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • python3.9和pycharm的安裝教程并創(chuàng)建簡(jiǎn)單項(xiàng)目的步驟

    python3.9和pycharm的安裝教程并創(chuàng)建簡(jiǎn)單項(xiàng)目的步驟

    這篇文章主要介紹了python3.9和pycharm的安裝教程并創(chuàng)建簡(jiǎn)單項(xiàng)目的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python二分法實(shí)現(xiàn)實(shí)例

    python二分法實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了python二分法的實(shí)現(xiàn)代碼,大家可以參考使用
    2013-11-11
  • Python BeautifulSoup庫(kù)的高級(jí)特性詳解

    Python BeautifulSoup庫(kù)的高級(jí)特性詳解

    在Python的網(wǎng)絡(luò)爬蟲(chóng)中,BeautifulSoup庫(kù)是一個(gè)強(qiáng)大的工具,用于解析HTML和XML文檔并提取其中的數(shù)據(jù),在這篇文章中,我們將深入研究BeautifulSoup的一些高級(jí)特性,讓您的爬蟲(chóng)工作更高效,更強(qiáng)大,需要的朋友可以參考下
    2023-08-08
  • python3之微信文章爬蟲(chóng)實(shí)例講解

    python3之微信文章爬蟲(chóng)實(shí)例講解

    下面小編就為大家?guī)?lái)一篇python3之微信文章爬蟲(chóng)實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Python 2.7.x 和 3.x 版本的重要區(qū)別小結(jié)

    Python 2.7.x 和 3.x 版本的重要區(qū)別小結(jié)

    這篇文章主要介紹了Python 2.7.x 和 3.x 版本的重要區(qū)別小結(jié),需要的朋友可以參考下
    2014-11-11
  • python簡(jiǎn)單實(shí)現(xiàn)刷新智聯(lián)簡(jiǎn)歷

    python簡(jiǎn)單實(shí)現(xiàn)刷新智聯(lián)簡(jiǎn)歷

    本文給大家分享的是個(gè)人弄的一個(gè)使用Python簡(jiǎn)單實(shí)現(xiàn)刷新智聯(lián)招聘簡(jiǎn)歷的小工具的代碼,非常的簡(jiǎn)單,給大家參考下吧。
    2016-03-03
  • Python實(shí)現(xiàn)監(jiān)聽(tīng)目錄并取消文件只讀屬性

    Python實(shí)現(xiàn)監(jiān)聽(tīng)目錄并取消文件只讀屬性

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)監(jiān)聽(tīng)目錄并取消文件只讀屬性,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • tensorflow更改變量的值實(shí)例

    tensorflow更改變量的值實(shí)例

    今天小編就為大家分享一篇tensorflow更改變量的值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論

台前县| 鄂尔多斯市| 赤峰市| 永清县| 剑河县| 静安区| 资中县| 喜德县| 航空| 合水县| 皮山县| 宁河县| 应城市| 修武县| 高平市| 克山县| 铁岭市| 龙门县| 咸丰县| 和平区| 新民市| 德格县| 建昌县| 江津市| 明星| 蒙山县| 临夏县| 多伦县| 信阳市| 云龙县| 历史| 平阳县| 犍为县| 藁城市| 奉贤区| 高陵县| 彩票| 会同县| 手游| 镇宁| 新余市|