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

Python Django中間件詳細(xì)介紹

 更新時(shí)間:2022年10月13日 11:17:21   作者:許小許520  
Django中的中間件是一個(gè)輕量級(jí)、底層的插件系統(tǒng),可以介入Django的請(qǐng)求和響應(yīng)處理過(guò)程,修改Django的輸入或輸出。中間件的設(shè)計(jì)為開(kāi)發(fā)者提供了一種無(wú)侵入式的開(kāi)發(fā)方式,增強(qiáng)了Django框架的健壯性

一 .中間件簡(jiǎn)介

中間件是Django請(qǐng)求/響應(yīng)處理的鉤子函數(shù)。它是一個(gè)輕量級(jí)的、低級(jí)的"插件系統(tǒng)",用于全局改變Django的輸入和輸出。中間件是幫助我們?cè)谝晥D函數(shù)執(zhí)行之前都可以做一些額外的操作,它本質(zhì)就是一個(gè)自定義類,類中定義幾個(gè)方法,Djago框架會(huì)在特定的時(shí)候自動(dòng)觸發(fā)。

每個(gè)中間件負(fù)責(zé)做一些特定的功能。例如,‘django.contrib.auth.middleware.AuthenticationMiddleware’,它是用來(lái)將用戶與請(qǐng)求關(guān)聯(lián)起來(lái)。

二 .編寫(xiě)自己的中間件

中間件工廠是一個(gè)可調(diào)用的程序,它接受請(qǐng)求并返回響應(yīng)。

中間件可以定義五個(gè)方法,分別是:

  • process_request(self, request)
  • process_response(self, request, response)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('來(lái)自M1 process_request')
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('來(lái)自M2 process_request')
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('來(lái)自M1 process_request')
    def process_response(self, request, response):
        print('來(lái)自M1 process_response')
        return response
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('來(lái)自M2 process_request')
    def process_response(self, request, response):
        print('來(lái)自M2 process_response')
        return response
  • process_resquest

需要一個(gè)參數(shù)request,它的返回值可以是None,也可以是HttpResponse對(duì)象,如果返回None,就繼續(xù)向下走,返回HttpResponse對(duì)象就不執(zhí)行視圖函數(shù)直接將對(duì)象返回給瀏覽器。

在process_request方法中,視圖函數(shù)是最后執(zhí)行的,靠前的先執(zhí)行。

總結(jié):

  • 中間件的process_request方法是在執(zhí)行視圖函數(shù)之前執(zhí)行的。
  • 當(dāng)配置多個(gè)中間件時(shí),會(huì)按照列表的索引值,從上到下依次執(zhí)行。
  • 不同的中間件之間傳遞的request是同一個(gè)對(duì)象。
  • process_response

在執(zhí)行完視圖函數(shù)之后才執(zhí)行,執(zhí)行順序和process_request方法相反,從下往上依次執(zhí)行。

定義process_response方法時(shí),需要傳參request和response,response是視圖函數(shù)返回的HttpResponse對(duì)象,如果返回一個(gè)自己定義的HttpResponse對(duì)象,瀏覽器接收到的也是自定義的而不是后端處理的。

  • process_view

process_view(self, request, view_func, view_args, view_kwargs)

該方法有四個(gè)參數(shù)

request是HttpRequest對(duì)象。

view_func是Django即將使用的視圖函數(shù)。 (它是實(shí)際的函數(shù)對(duì)象,而不是函數(shù)的名稱作為字符串。)

view_args是將傳遞給視圖的位置參數(shù)的列表.

view_kwargs是將傳遞給視圖的關(guān)鍵字參數(shù)的字典。 view_args和view_kwargs都不包含第一個(gè)視圖參數(shù)(request)。

Django會(huì)在調(diào)用視圖函數(shù)之前調(diào)用此方法,返回None或者HttpResponse對(duì)象,如果返回None,Django將繼續(xù)處理這個(gè)請(qǐng)求,執(zhí)行其他中間件的process_view方法,然后執(zhí)行視圖函數(shù)。如果返回HttpResponse對(duì)象,那么就不執(zhí)行視圖函數(shù),而是直接掉頭,執(zhí)行process_response方法返回給瀏覽器。

process_view方法是在Django路由系統(tǒng)之后,視圖系統(tǒng)之前執(zhí)行的,執(zhí)行順序按照MIDDLEWARE中的注冊(cè)順序從前到后順序執(zhí)行的。

  • process_exception

process_exception(self, request, exception)

該方法兩個(gè)參數(shù):

一個(gè)HttpRequest對(duì)象

一個(gè)exception是視圖函數(shù)異常產(chǎn)生的Exception對(duì)象。

這個(gè)方法只有在視圖函數(shù)中出現(xiàn)異常了才執(zhí)行,它返回的值可以是一個(gè)None也可以是一個(gè)HttpResponse對(duì)象。如果是HttpResponse對(duì)象,Django將調(diào)用模板和中間件中的process_response方法,并返回給瀏覽器,否則將默認(rèn)處理異常。如果返回一個(gè)None,則交給下一個(gè)中間件的process_exception方法來(lái)處理異常。它的執(zhí)行順序也是按照中間件注冊(cè)順序的倒序執(zhí)行。

  • process_template_response

process_template_response(self, request, response)

它的參數(shù),一個(gè)HttpRequest對(duì)象,response是TemplateResponse對(duì)象(由視圖函數(shù)或者中間件產(chǎn)生)。

process_template_response是在視圖函數(shù)執(zhí)行完成后立即執(zhí)行,但是它有一個(gè)前提條件,那就是視圖函數(shù)返回的對(duì)象有一個(gè)render()方法(或者表明該對(duì)象是一個(gè)TemplateResponse對(duì)象或等價(jià)方法)。

三 .中間件執(zhí)行流程

當(dāng)有請(qǐng)求來(lái)時(shí),先按照前后順序依次執(zhí)行process_request()方法,process_request如果返回None,就往下執(zhí)行,如果返回一個(gè)HttpResponse對(duì)象就不執(zhí)行process_request,而是執(zhí)行當(dāng)前層級(jí)的process_response方法,依次向上執(zhí)行,返回給瀏覽器。例如下圖中在中間件3返回了HttpResponse對(duì)象,就執(zhí)行中間件3的process_response,依次往上返回給瀏覽器。下面的process_request,process_response都不會(huì)執(zhí)行。

process_request方法都執(zhí)行完,找到對(duì)應(yīng)的視圖函數(shù),先不執(zhí)行視圖函數(shù),而是執(zhí)行中間件中的process_view方法,process_view返回None就繼續(xù)依次執(zhí)行,所有的process_view執(zhí)行完才執(zhí)行視圖函數(shù)。下圖中的中間件3返回了HttpResponse對(duì)象,下面的process_view方法就不執(zhí)行了,直接執(zhí)行最下邊的process_response方法,依次向上返回給瀏覽器。

process_template_response和process_exception兩個(gè)方法的觸發(fā)是有條件的,執(zhí)行順序也是倒序。

到此這篇關(guān)于Python Django中間件詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Python Django 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python本地降級(jí)pip的方法步驟

    python本地降級(jí)pip的方法步驟

    高版本的pip在使用過(guò)程中會(huì)出現(xiàn)很多的不兼容問(wèn)題,而且不留神很容易把pip給升級(jí)了,下面這篇文章主要給大家介紹了關(guān)于python本地降級(jí)pip的方法步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Pyqt5實(shí)戰(zhàn)小案例之界面與邏輯分離的小計(jì)算器程序

    Pyqt5實(shí)戰(zhàn)小案例之界面與邏輯分離的小計(jì)算器程序

    網(wǎng)上很多PyQt5信號(hào)槽與界面分離的例子,但是真正開(kāi)發(fā)起來(lái)很不方便,下面這篇文章主要給大家介紹了關(guān)于Pyqt5實(shí)戰(zhàn)小案例之界面與邏輯分離的小計(jì)算器程序,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • python調(diào)試神器PySnooper的使用

    python調(diào)試神器PySnooper的使用

    這篇文章主要介紹了python調(diào)試神器PySnooper的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Selenium中免登錄的實(shí)現(xiàn)方法option詳解

    Selenium中免登錄的實(shí)現(xiàn)方法option詳解

    在selenium中有很多種可以實(shí)現(xiàn)網(wǎng)站的免登錄,option就是其中的一種做法,這篇文章主要介紹了Selenium中免登錄的實(shí)現(xiàn)方法option,需要的朋友可以參考下
    2022-12-12
  • Python批量啟動(dòng)多線程代碼實(shí)例

    Python批量啟動(dòng)多線程代碼實(shí)例

    這篇文章主要介紹了python批量啟動(dòng)多線程代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python實(shí)現(xiàn)屏保計(jì)時(shí)器的示例代碼

    python實(shí)現(xiàn)屏保計(jì)時(shí)器的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)屏保計(jì)時(shí)器的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Python實(shí)現(xiàn)自動(dòng)化郵件發(fā)送過(guò)程詳解

    Python實(shí)現(xiàn)自動(dòng)化郵件發(fā)送過(guò)程詳解

    這篇文章主要介紹了如何利用Python實(shí)現(xiàn)自動(dòng)化郵件發(fā)送,可以讓你擺脫繁瑣的重復(fù)性業(yè)務(wù),可以節(jié)省非常多的時(shí)間。感興趣的小伙伴可以試一試
    2022-01-01
  • Tensorflow2.4使用Tuner選擇模型最佳超參詳解

    Tensorflow2.4使用Tuner選擇模型最佳超參詳解

    這篇文章主要介紹了Tensorflow2.4使用Tuner選擇模型最佳超參詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解Django中CBV(Class Base Views)模型源碼分析

    詳解Django中CBV(Class Base Views)模型源碼分析

    這篇文章主要介紹了詳解Django中CBV(Class Base Views)模型源碼分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Python序列化與反序列化相關(guān)知識(shí)總結(jié)

    Python序列化與反序列化相關(guān)知識(shí)總結(jié)

    今天給大家?guī)?lái)關(guān)于python的相關(guān)知識(shí),文章圍繞著Python序列化與反序列展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

禄丰县| 简阳市| 屯门区| 城固县| 柳州市| 绩溪县| 巫山县| 巴林左旗| 北京市| 大理市| 二连浩特市| 昌邑市| 白城市| 长汀县| 洞口县| 鲁甸县| 新巴尔虎右旗| 石泉县| 达拉特旗| 桐梓县| 睢宁县| 淳安县| 余干县| 保康县| 延吉市| 图木舒克市| 历史| 抚顺市| 达拉特旗| 临夏县| 德格县| 祁门县| 许昌市| 黎城县| 江津市| 肥东县| 西畴县| 南平市| 中宁县| 临沂市| 临汾市|