欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Django中間件詳細介紹

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

一 .中間件簡介

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

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

二 .編寫自己的中間件

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

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

  • 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('來自M1 process_request')
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('來自M2 process_request')
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('來自M1 process_request')
    def process_response(self, request, response):
        print('來自M1 process_response')
        return response
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('來自M2 process_request')
    def process_response(self, request, response):
        print('來自M2 process_response')
        return response
  • process_resquest

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

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

總結(jié):

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

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

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

  • process_view

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

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

request是HttpRequest對象。

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

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

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

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

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

  • process_exception

process_exception(self, request, exception)

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

一個HttpRequest對象

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

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

  • process_template_response

process_template_response(self, request, response)

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

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

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

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

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

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

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

相關(guān)文章

  • Python實現(xiàn)的批量修改文件后綴名操作示例

    Python實現(xiàn)的批量修改文件后綴名操作示例

    這篇文章主要介紹了Python實現(xiàn)的批量修改文件后綴名操作,涉及Python目錄文件的遍歷、重命名等相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • Python 字符串操作方法大全

    Python 字符串操作方法大全

    python字符串操作實方法大合集,包括了幾乎所有常用的python字符串操作,如字符串的替換、刪除、截取、復制、連接、比較、查找、分割等,需要的朋友可以參考下
    2014-03-03
  • python GUI計算器的實現(xiàn)

    python GUI計算器的實現(xiàn)

    這篇文章主要介紹了python gui計算器的實現(xiàn),幫助大家更好的理解和學習python gui編程,感興趣的朋友可以了解下
    2020-10-10
  • matplotlib繪制鼠標的十字光標的實現(xiàn)(內(nèi)置方式)

    matplotlib繪制鼠標的十字光標的實現(xiàn)(內(nèi)置方式)

    這篇文章主要介紹了matplotlib繪制鼠標的十字光標的實現(xiàn)(內(nèi)置方式),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • python強大的hook函數(shù)使用及應用場景

    python強大的hook函數(shù)使用及應用場景

    鉤子函數(shù)(hook function)是把我們自己實現(xiàn)的hook函數(shù)在某一時刻掛接到目標掛載點上,這篇文章主要介紹了python強大的hook函數(shù)使用及應用場景,需要的朋友可以參考下
    2023-05-05
  • jupyter notebook中圖片顯示不出來的解決

    jupyter notebook中圖片顯示不出來的解決

    這篇文章主要介紹了jupyter notebook中圖片顯示不出來的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Pandas DataFrame中的tuple元素遍歷的實現(xiàn)

    Pandas DataFrame中的tuple元素遍歷的實現(xiàn)

    這篇文章主要介紹了Pandas DataFrame中的tuple元素遍歷的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • python代碼實現(xiàn)圖書管理系統(tǒng)

    python代碼實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python代碼實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Python計算機視覺里的IOU計算實例

    Python計算機視覺里的IOU計算實例

    今天小編就為大家分享一篇Python計算機視覺里的IOU計算實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 深入理解最新Python中的Match Case

    深入理解最新Python中的Match Case

    最近發(fā)布的 Python 3.10 的所有主要新特性中最重要就是 Match-Case 語法,本文將帶你深入探討,會發(fā)現(xiàn) Match-Case 其實沒有那么簡單
    2021-11-11

最新評論