成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

flask 上下文的實(shí)現(xiàn)

lncwwn / 840人閱讀

摘要:值得注意的是這個(gè)對(duì)象在創(chuàng)建時(shí),將實(shí)例的本身作為實(shí)參傳入自身,因此,。到這里想必已經(jīng)很清楚了就是指對(duì)象就是對(duì)應(yīng)每次請(qǐng)求創(chuàng)建的對(duì)象通過將與關(guān)聯(lián)起來總結(jié)創(chuàng)建了,這個(gè)對(duì)應(yīng)的上下文,就是每響應(yīng)一個(gè)請(qǐng)求,就會(huì)創(chuàng)建一個(gè)對(duì)象,這個(gè)對(duì)象對(duì)應(yīng)的上下文,就是

引言

本文主要梳理了flask的current_app, request, session, g的實(shí)現(xiàn)原理

源碼說明

本文使用flask 0.5 版本

application context 和request context

flask有兩個(gè)context: application contextrequest context

application context request context
current_app request
g session

這里需要通俗地解釋一下application contextrequest context

application 指的就是當(dāng)你調(diào)用app = Flask(__name__)創(chuàng)建的這個(gè)對(duì)象app

request 指的是每次http請(qǐng)求發(fā)生時(shí),WSGI server(比如gunicorn)調(diào)用Flask.__call__()之后,在Flask對(duì)象內(nèi)部創(chuàng)建的Request對(duì)象;

application 表示用于響應(yīng)WSGI請(qǐng)求的應(yīng)用本身,request 表示每次http請(qǐng)求;

application的生命周期大于request,一個(gè)application存活期間,可能發(fā)生多次http請(qǐng)求,所以,也就會(huì)有多個(gè)request

下面通過源碼了解一下 flask 如何實(shí)現(xiàn)這兩種context:

# 代碼摘選自flask 0.5 中的ctx.py文件, 進(jìn)行了部分刪減
class _RequestContext(object):
    
    def __init__(self, app, environ):
        self.app = app
        self.request = app.request_class(environ)
        self.session = app.open_session(self.request)
        self.g = _RequestGlobals()

flask 使用_RequestContext的代碼如下:

class Flask(object):

    def request_context(self, environ):
        return _RequestContext(self, environ)

Flask類中,每次請(qǐng)求都會(huì)調(diào)用這個(gè)request_context函數(shù)。這個(gè)函數(shù)則會(huì)創(chuàng)建一個(gè)_RequestContext對(duì)象。

值得注意的是:這個(gè)對(duì)象在創(chuàng)建時(shí),將Flask實(shí)例的本身作為實(shí)參傳入_RequestContext自身,因此,
self.app = Flask()。

所以,雖然每次http請(qǐng)求都會(huì)創(chuàng)建一個(gè)_RequestContext對(duì)象,但是,每次創(chuàng)建的時(shí)候都會(huì)將同一個(gè)Flask對(duì)象傳入該對(duì)象的app成員變量,使得:

由同一個(gè)Flask對(duì)象響應(yīng)的請(qǐng)求所創(chuàng)建的_RequestContext對(duì)象的app成員變量都共享同一個(gè)application

通過在Flask對(duì)象中創(chuàng)建_RequestContext對(duì)象,并將Flask自身作為參數(shù)傳入_RequestContext對(duì)象的方式,實(shí)現(xiàn)了多個(gè)request context對(duì)應(yīng)一個(gè)application context 的目的。

接下來,看self.request = app.request_class(environ)這句。
由于app成員變量就是app = Flask(__name__)這個(gè)對(duì)象,所以,app.request_class就是Flask.request_class。
Flask類的定義中:

request_class = Request # Request 是一個(gè)類,定義如下:

class Request(RequestBase):
    ...

所以:
self.request = app.request_class(environ)實(shí)際上是創(chuàng)建了一個(gè)Request對(duì)象。
由于,一個(gè)http請(qǐng)求對(duì)應(yīng)一個(gè)_RequestContext對(duì)象的創(chuàng)建,而每個(gè)_RequestContext對(duì)象的創(chuàng)建對(duì)應(yīng)一個(gè)Request對(duì)象的創(chuàng)建,所以,每個(gè)http請(qǐng)求對(duì)應(yīng)一個(gè)Request對(duì)象。

到這里想必已經(jīng)很清楚了:

application 就是指app = Flask(__name__)對(duì)象
request 就是對(duì)應(yīng)每次http 請(qǐng)求創(chuàng)建的Request對(duì)象
flask通過_RequestContextappRequest關(guān)聯(lián)起來

總結(jié)

app = Flask(__name__)創(chuàng)建了application, 這個(gè)application對(duì)應(yīng)的上下文,就是application context

Flask每響應(yīng)一個(gè)http請(qǐng)求,就會(huì)創(chuàng)建一個(gè)Request對(duì)象,這個(gè)request對(duì)象對(duì)應(yīng)的上下文,就是request context

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37717.html

相關(guān)文章

  • 一個(gè)Flask應(yīng)用運(yùn)行過程剖析

    摘要:本文就主要針對(duì)一個(gè)應(yīng)用的運(yùn)行過程進(jìn)行簡(jiǎn)要分析,后續(xù)文章還會(huì)對(duì)框架的一些具體問題進(jìn)行分析。所有的請(qǐng)求處理過程,都會(huì)在這個(gè)上下文對(duì)象中進(jìn)行。和一些全局變量注意當(dāng)進(jìn)入這個(gè)上下文對(duì)象時(shí),會(huì)觸發(fā)。 相信很多初學(xué)Flask的同學(xué)(包括我自己),在閱讀官方文檔或者Flask的學(xué)習(xí)資料時(shí),對(duì)于它的認(rèn)識(shí)是從以下的一段代碼開始的: from flask import Flask app = Flask(...

    shmily 評(píng)論0 收藏0
  • Flask請(qǐng)求下文和應(yīng)用下文

    摘要:并且棧頂?shù)脑囟际堑恼?qǐng)求上下文和應(yīng)用上下文之后,我們?cè)僭谶@個(gè)環(huán)境中嵌套的應(yīng)用上下文。這時(shí)查看兩個(gè)棧的內(nèi)容,發(fā)現(xiàn)兩個(gè)棧中只有的請(qǐng)求的請(qǐng)求上下文對(duì)象和應(yīng)用上下文對(duì)象。而等一直指向棧頂?shù)恼?qǐng)求上下文對(duì)象,分別引用請(qǐng)求上下文的和。 在Flask中處理請(qǐng)求時(shí),應(yīng)用會(huì)生成一個(gè)請(qǐng)求上下文對(duì)象。整個(gè)請(qǐng)求的處理過程,都會(huì)在這個(gè)上下文對(duì)象中進(jìn)行。這保證了請(qǐng)求的處理過程不被干擾。處理請(qǐng)求的具體代碼如下: de...

    sourcenode 評(píng)論0 收藏0
  • flask源碼走讀

    摘要:另外,如果你對(duì)模板渲染部分的內(nèi)容感興趣,也可以考慮閱讀文檔文檔文檔源碼閱讀,可以參考下面的函數(shù)打斷點(diǎn),再測(cè)試一個(gè)請(qǐng)求,理清過程。 Flask-Origin 源碼版本 一直想好好理一下flask的實(shí)現(xiàn),這個(gè)項(xiàng)目有Flask 0.1版本源碼并加了注解,挺清晰明了的,我在其基礎(chǔ)上完成了對(duì)Werkzeug的理解部分,大家如果想深入學(xué)習(xí)的話,可以參考werkzeug_flow.md. 閱讀前 為...

    Coly 評(píng)論0 收藏0
  • Flask內(nèi)置命令行工具—CLI

    摘要:如果設(shè)置為,命令將激活模式,執(zhí)行會(huì)啟用交互式調(diào)試器和代碼自動(dòng)重載。也可以通過變量單獨(dú)控制,表示啟用,表示禁用通過設(shè)置環(huán)境變量略通過設(shè)置環(huán)境變量略自定義命令命令基于庫(kù)實(shí)現(xiàn)。 應(yīng)用發(fā)現(xiàn) flask命令在Flask庫(kù)安裝后可使用,使用前需要正確配置FLASK_APP環(huán)境變量以告知用戶程序所在位置。不同平臺(tái)設(shè)置方式有所不同。 Unix Bash (Linux, Mac, etc.): $ ex...

    nicercode 評(píng)論0 收藏0
  • 深入理解flask框架(2):應(yīng)用下文與請(qǐng)求下文

    摘要:實(shí)現(xiàn)一個(gè)進(jìn)程中擁有多個(gè)應(yīng)用上下文機(jī)制依賴的數(shù)據(jù)結(jié)構(gòu)上下文機(jī)制的實(shí)現(xiàn)基于的。 什么是上下文? flask框架中的上下文本質(zhì)上就是兩個(gè)類,我們可以先看一下他的初始化函數(shù):應(yīng)用上下文 class AppContext(object): The application context binds an application object implicitly to the c...

    wushuiyong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<