国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件

這篇具有很好參考價(jià)值的文章主要介紹了(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

中間件

一、剖析:

在前面講session部分提到過(guò):請(qǐng)求一進(jìn)來(lái),F(xiàn)lask會(huì)自動(dòng)調(diào)用應(yīng)用程序?qū)ο蟆綟lask(__name__)】的__call__方法,這個(gè)方法負(fù)責(zé)處理請(qǐng)求并返回響應(yīng)(其實(shí)如下圖:其內(nèi)部就是wsgi_app方法)。它是WSGI規(guī)范所要求的。

(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件,Flask框架從入門到實(shí)戰(zhàn),flask,中間件,python,s覆寫wsgi_app函數(shù),自定義中間件

wsgi_app方法內(nèi)部,F(xiàn)lask會(huì)根據(jù)路由規(guī)則和視圖函數(shù)來(lái)確定如何處理請(qǐng)求,并生成相應(yīng)的響應(yīng)。最終,wsgi_app方法會(huì)將響應(yīng)返回給Web服務(wù)器,供其發(fā)送給客戶端(前面詳細(xì)講過(guò),后面還會(huì)再細(xì)細(xì)剖析)。

所以,這里就有一個(gè)坑可以讓我們操作,即我們可以通過(guò)覆寫wsgi_app方法,實(shí)現(xiàn)自己的中間件邏輯,例如身份驗(yàn)證、日志記錄等。

而且這個(gè)坑牛逼之處在于:我們可以借由它實(shí)現(xiàn)在最開始的開始和最后的最后做操作?。?!多加理解,底下會(huì)詳細(xì)講解。

結(jié)合實(shí)戰(zhàn)講解—通過(guò)覆寫wsgi_app函數(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的中間件:

from flask import Flask

app = Flask(__name__)


class MyMiddleware:
    def __init__(self, old_wsgi_app):
        # 服務(wù)端啟動(dòng)時(shí),自動(dòng)執(zhí)行
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, environ, start_response):
        # 每次有用戶請(qǐng)求到來(lái)時(shí)執(zhí)行
        # 在請(qǐng)求到達(dá)視圖函數(shù)之前執(zhí)行的代碼
        print("Before request")

        # 調(diào)用原始的wsgi_app函數(shù)處理請(qǐng)求
        response = self.old_wsgi_app(environ, start_response)

        # 在響應(yīng)發(fā)送給客戶端之前執(zhí)行的代碼
        print("After request")

        return response


@app.route('/')
def home():
    return "Hello, GuHanZhe~"


# 設(shè)置自定義中間件實(shí)例為應(yīng)用程序?qū)ο蟮膚sgi_app屬性
app.wsgi_app = MyMiddleware(app.wsgi_app)

if __name__ == '__main__':
    app.run()

在上述示例中,我定義了一個(gè)名為MyMiddleware的類,它接受一個(gè)Flask應(yīng)用程序?qū)ο蟮?code>wsgi_app方法作為參數(shù)。該類實(shí)現(xiàn)了__call__方法,這是一個(gè)wsgi應(yīng)用程序必須具備的方法。在__call__方法中,大家可以編寫自己的中間件邏輯。

__call__方法中,大家可以首先執(zhí)行在請(qǐng)求到達(dá)視圖函數(shù)之前需要執(zhí)行的代碼,然后調(diào)用原始的wsgi_app方法處理請(qǐng)求,并將響應(yīng)保存在response變量中。最后,在響應(yīng)發(fā)送給客戶端之前,大家可以執(zhí)行一些在響應(yīng)階段需要執(zhí)行的代碼。

通過(guò)創(chuàng)建自定義中間件實(shí)例,并將其設(shè)置為Flask應(yīng)用程序?qū)ο蟮?code>wsgi_app屬性,就可以使用自定義的中間件了。

請(qǐng)注意,自定義中間件類必須實(shí)現(xiàn)__call__方法,并且接受environstart_response參數(shù),這是遵守WSGI規(guī)范。

而且看Flask的wsgi_app函數(shù)源碼,也是如此:

(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件,Flask框架從入門到實(shí)戰(zhàn),flask,中間件,python,s覆寫wsgi_app函數(shù),自定義中間件

需要注意的是:在print("Before request")部分做操作時(shí),只有原生的請(qǐng)求相關(guān)的數(shù)據(jù)environ,所以就只能對(duì)原生的environ做操作! request和session是都沒(méi)有的!!!

二、應(yīng)用點(diǎn):

通過(guò)覆寫wsgi_app函數(shù)實(shí)現(xiàn)的自定義中間件可以有如下幾種在開發(fā)時(shí)的應(yīng)用點(diǎn):

  1. 可以對(duì)請(qǐng)求進(jìn)行預(yù)處理:通過(guò)覆寫wsgi_app函數(shù),可以在請(qǐng)求到達(dá)視圖函數(shù)之前執(zhí)行一些代碼邏輯,例如身份驗(yàn)證、參數(shù)解析、請(qǐng)求日志記錄等。這樣可以方便地對(duì)請(qǐng)求進(jìn)行預(yù)處理,并根據(jù)需要做出相應(yīng)的處理。

  2. 可以對(duì)響應(yīng)進(jìn)行后處理:同樣地,在覆寫wsgi_app函數(shù)時(shí),還可以在響應(yīng)發(fā)送給客戶端之前執(zhí)行一些代碼邏輯,例如響應(yīng)的加工、錯(cuò)誤處理、響應(yīng)日志記錄等。這樣可以方便地對(duì)響應(yīng)進(jìn)行后處理,以滿足特定的需求。

  3. 可以實(shí)現(xiàn)自定義中間件功能:通過(guò)覆寫wsgi_app函數(shù),可以實(shí)現(xiàn)自定義的中間件功能。中間件是一種可重用的組件,可以用于添加額外的邏輯或修改請(qǐng)求/響應(yīng)的行為。可以根據(jù)具體需求編寫自己的中間件,并將其插入Flask應(yīng)用程序?qū)ο蟮奶幚砹鞒讨小?/p>

  4. 可以實(shí)現(xiàn)多個(gè)中間件的串聯(lián):Flask允許使用多個(gè)中間件,并且這些中間件可以按照特定的順序串聯(lián)起來(lái)。通過(guò)覆寫wsgi_app函數(shù),可以輕松地將多個(gè)中間件組合起來(lái),形成一個(gè)中間件鏈條。每個(gè)中間件都可以獨(dú)立地處理請(qǐng)求和響應(yīng),并將處理結(jié)果傳遞給下一個(gè)中間件。

  5. 可以修改請(qǐng)求和響應(yīng):通過(guò)覆寫wsgi_app函數(shù),可以自由地修改請(qǐng)求和響應(yīng)對(duì)象。這包括添加、刪除或修改請(qǐng)求頭部信息,修改請(qǐng)求體內(nèi)容,修改響應(yīng)狀態(tài)碼,添加響應(yīng)頭部信息等。這樣可以實(shí)現(xiàn)更加靈活和定制化的請(qǐng)求/響應(yīng)處理。

總而言之,覆寫wsgi_app函數(shù)實(shí)現(xiàn)中間件提供了對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理和后處理的能力,同時(shí)也允許編寫自定義的中間件功能。這樣可以增強(qiáng)Flask應(yīng)用程序的功能和靈活性,滿足特定的需求。

就比如要做IP黑名單,就可以在before里直接寫邏輯(environ里有請(qǐng)求IP信息),這樣就可以在最開始的開始直接限制!

拓展:

(1)在Python中,當(dāng)一個(gè)對(duì)象后面能加括號(hào),那么這個(gè)對(duì)象可能是什么?

  1. 函數(shù):一個(gè)函數(shù)是可調(diào)用的對(duì)象。通過(guò)在函數(shù)名后加上括號(hào),可以執(zhí)行該函數(shù)并傳遞相應(yīng)的參數(shù)。

  2. 方法:方法是屬于類的函數(shù)。通過(guò)在實(shí)例或類名后加上括號(hào),可以調(diào)用該方法并傳遞相應(yīng)的參數(shù)。

  3. 類:類本身也是可調(diào)用的對(duì)象。通過(guò)在類名后加上括號(hào),可以創(chuàng)建類的實(shí)例。

  4. 對(duì)象:某個(gè)類的實(shí)例對(duì)象也可以是可調(diào)用的對(duì)象。通過(guò)在對(duì)象名后加上括號(hào),可以調(diào)用該對(duì)象所屬類中定義的特殊方法,例如__call__()方法。

(2)在Python中,函數(shù)和方法分別是什么?

首先,要認(rèn)識(shí)到在Python中,函數(shù)(function)和方法(method)是兩種不同的概念。這也是為啥我給的問(wèn)題是“函數(shù)和方法分別是什么?”

  1. 函數(shù)(function)是一段封裝了特定功能的可重用代碼塊。它接收輸入?yún)?shù),執(zhí)行特定的操作,并返回結(jié)果。 函數(shù)可以在任何地方定義和使用,不依賴于任何類或?qū)ο?。它們通常用于模塊化代碼、提高代碼的復(fù)用性和可維護(hù)性。

    例如,下面是一個(gè)簡(jiǎn)單的函數(shù)示例:

def add(a, b):
    return a + b


result = add(2, 3)
print(result)  
  1. **方法(method)是屬于某個(gè)類的函數(shù)。**它定義在類的內(nèi)部,并且可以訪問(wèn)類的屬性和其他方法。**方法通過(guò)對(duì)類的實(shí)例進(jìn)行調(diào)用來(lái)執(zhí)行相應(yīng)的操作。**每個(gè)方法的第一個(gè)參數(shù)通常都是 self,它表示方法所屬的實(shí)例對(duì)象。

    例如,下面是一個(gè)簡(jiǎn)單的類和方法示例:

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius * self.radius

circle = Circle(5)
circle_area = circle.area()
print(circle_area)  # 輸出:78.5

在上面的示例中,area()Circle 類的一個(gè)方法,它可以通過(guò) circle.area() 的方式進(jìn)行調(diào)用。

需要注意的是,對(duì)于一個(gè)類里面的函數(shù),它究竟真是函數(shù)還是方法,取決于誰(shuí)調(diào)用它?。?!

舉個(gè)例子:

(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件,Flask框架從入門到實(shí)戰(zhàn),flask,中間件,python,s覆寫wsgi_app函數(shù),自定義中間件

上圖中Test.index執(zhí)行的話,此時(shí)index作為函數(shù),意思是執(zhí)行類里面的函數(shù);

而下面是通過(guò)類的實(shí)例調(diào)用,所以此時(shí)是方法。

或者這樣也能證明:

from types import MethodType, FunctionType

class Test(object):
    def index(self):
        pass


# print(Test.index)
print(isinstance(Test.index, FunctionType))

test = Test()
# print(test.index)
print(isinstance(test.index, MethodType))

(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件,Flask框架從入門到實(shí)戰(zhàn),flask,中間件,python,s覆寫wsgi_app函數(shù),自定義中間件

總結(jié):函數(shù)是獨(dú)立的可調(diào)用代碼塊,而方法是屬于類的函數(shù),需要通過(guò)類的實(shí)例進(jìn)行調(diào)用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-754371.html

到了這里,關(guān)于(十五)Flask覆寫wsgi_app函數(shù)實(shí)現(xiàn)自定義中間件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • (二十五)Flask之MTV&MVC架構(gòu)模式Demo【重點(diǎn):原生session使用及易錯(cuò)點(diǎn)!】

    (二十五)Flask之MTV&MVC架構(gòu)模式Demo【重點(diǎn):原生session使用及易錯(cuò)點(diǎn)!】

    ????作者介紹:【孤寒者】—CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領(lǐng)域博主、CSDN原力計(jì)劃作者 ???? 本文已收錄于Flask框架從入門到實(shí)戰(zhàn)專欄 :《Flask框架從入門到實(shí)戰(zhàn)》 ???? 熱門專欄推薦 :《Python全棧系列教程》、《爬蟲從入門到精通系列

    2024年03月21日
    瀏覽(24)
  • uni-app實(shí)現(xiàn)自定義導(dǎo)航欄,兼容H5、App、微信小程序

    uni-app實(shí)現(xiàn)自定義導(dǎo)航欄,兼容H5、App、微信小程序

    很多情況下,系統(tǒng)自帶的導(dǎo)航欄無(wú)法滿足UI設(shè)計(jì)的要求,這時(shí)候就需要我們自定義導(dǎo)航欄來(lái)實(shí)現(xiàn)需求,要考慮跨端的多種情況,這里我們封裝成一個(gè)組件來(lái)使用,實(shí)現(xiàn)效果如下: 一、H5、App、微信小程序的區(qū)別 1.H5:導(dǎo)航欄高度可以設(shè)為44px,它沒(méi)有狀態(tài)欄,因?yàn)镠5端運(yùn)行在瀏覽

    2024年04月13日
    瀏覽(105)
  • Chrome 插件開發(fā)覆寫xhr請(qǐng)求

    Chrome 插件開發(fā)覆寫xhr請(qǐng)求

    這幾天搞chrome谷歌瀏覽器插件遇到個(gè)問(wèn)題 我想攔截網(wǎng)頁(yè)請(qǐng)求,并把數(shù)據(jù)傳遞到下一個(gè)子窗口。獲取responsebody內(nèi)容?background.js 單純靠sendmessage實(shí)現(xiàn)不了通訊 最開始的時(shí)候想用chrome.webRequest.onCompleted.addListener去實(shí)現(xiàn)攔截,注入后發(fā)現(xiàn)最多只能取到header信息,回調(diào)函數(shù)里面的對(duì)象并

    2024年02月11日
    瀏覽(24)
  • uni-app小程序父組件數(shù)據(jù)更新,實(shí)現(xiàn)自定義組件刷新視圖

    uni-app小程序父組件數(shù)據(jù)更新,實(shí)現(xiàn)自定義組件刷新視圖

    之前錯(cuò)誤的思路 新思路(忽略我的參數(shù)命名,寫文章的時(shí)候方便。)

    2024年02月16日
    瀏覽(27)
  • uniapp實(shí)現(xiàn)自定義導(dǎo)航內(nèi)容高度居中(兼容APP端以及小程序端與膠囊對(duì)齊)

    uniapp實(shí)現(xiàn)自定義導(dǎo)航內(nèi)容高度居中(兼容APP端以及小程序端與膠囊對(duì)齊)

    ①效果圖如下 1.小程序端與膠囊對(duì)齊 2.APP端內(nèi)容區(qū)域居中 ? ? 注意:上面使用的是colorui里面的自定義導(dǎo)航樣式。 ②思路: 1.APP端和小程序端走不同的方法,因?yàn)樾〕绦蚨艘?jì)算不同屏幕下右側(cè)膠囊的高度。 2.其次最重要的要清晰App端和小程序端的計(jì)算邏輯。 3.然后調(diào)用api獲

    2024年02月13日
    瀏覽(24)
  • 十五、環(huán)境變量和代理跨域及api的定義

    十五、環(huán)境變量和代理跨域及api的定義

    在根目錄下新建三個(gè)環(huán)境變量配置文件 .env.development(開發(fā)環(huán)境).env.test(測(cè)試環(huán)境).evn.production(生產(chǎn)環(huán)境) 分別定義開發(fā)環(huán)境、線上環(huán)境和測(cè)試環(huán)境的變量 webpack vite:默認(rèn)只有 VITE_ 開頭的變量可以被訪問(wèn) webpack: process.env.VUE_APP_TITLE vite: import.meta.env vite.config.js: loadEnv 配置

    2024年02月19日
    瀏覽(16)
  • Flask_自定義flask的cmd命令

    Flask_自定義flask的cmd命令

    創(chuàng)建自定義命令 執(zhí)行flask --help 可以在命令查看定義的命令 注意事項(xiàng):入口文件名稱必須為app,否則查看不到,也不會(huì)生效 執(zhí)行命令 當(dāng)入口文件名稱為app是,flask run 也可以缺省其他參數(shù),直接調(diào)用app.py文件啟動(dòng)服務(wù) 各位想獲取源碼等教程資料的朋友請(qǐng) 點(diǎn)贊 + 評(píng)論 + 收藏 ,

    2024年02月17日
    瀏覽(17)
  • 【C語(yǔ)言】自定義實(shí)現(xiàn)strlen函數(shù)的3種方法

    【C語(yǔ)言】自定義實(shí)現(xiàn)strlen函數(shù)的3種方法

    大家好,我是蘇貝,本篇博客帶大家了解C語(yǔ)言中自定義實(shí)現(xiàn)strlen函數(shù)的3種方法,如果大家覺(jué)得我寫的不錯(cuò)的話,可以給我一個(gè)贊??嗎,感謝?? 函數(shù)原型 :size_t strlen( const char string ); //求string的長(zhǎng)度 頭文件 :#includestring.h 返回值 :返回的是第一個(gè)目的數(shù)字的首地址,類型為

    2024年02月13日
    瀏覽(20)
  • Python學(xué)習(xí)筆記-WSGI接口

    Python學(xué)習(xí)筆記-WSGI接口

    Web服務(wù)器網(wǎng)關(guān)接口 ( Python Web Server Gateway Interface ,縮寫為WSGI)是為Python語(yǔ)言定義的Web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡(jiǎn)單而通用的接口。自從WSGI被開發(fā)出來(lái)以后,許多其它語(yǔ)言中也出現(xiàn)了類似接口。 是CGI和FastCGI的升級(jí)版本。 當(dāng)服 客戶端發(fā)起一個(gè)請(qǐng)求 服務(wù)器通過(guò)

    2024年02月16日
    瀏覽(12)
  • Threejs進(jìn)階之十五:在Thereejs 使用自定義shader

    Threejs進(jìn)階之十五:在Thereejs 使用自定義shader

    先看下這次代碼最終要實(shí)現(xiàn)的效果, 效果分析: 要實(shí)現(xiàn)上述效果,我們需要兩張圖片,作為紋理貼圖,使其圖案產(chǎn)生明暗效果;然后通過(guò)定義ShaderMaterial對(duì)象通過(guò)自定義Shader實(shí)現(xiàn)上述效果;后面代碼中會(huì)進(jìn)行詳細(xì)分析; 這里我們先介紹下基礎(chǔ)知識(shí) Shader(著色器)是一種在圖

    2024年02月05日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包