摘要:值得注意的是這個(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 contextflask有兩個(gè)context: application context和request context
application context | request context | |
---|---|---|
current_app | request | |
g | session |
這里需要通俗地解釋一下application context與request 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通過_RequestContext將app與Request關(guān)聯(lián)起來
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
摘要:本文就主要針對(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(...
摘要:并且棧頂?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...
摘要:另外,如果你對(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. 閱讀前 為...
摘要:如果設(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...
摘要:實(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...
閱讀 1433·2019-08-30 15:55
閱讀 1692·2019-08-26 10:21
閱讀 3476·2019-08-23 18:28
閱讀 3405·2019-08-23 15:38
閱讀 771·2019-08-23 15:24
閱讀 2164·2019-08-23 13:59
閱讀 805·2019-08-23 11:31
閱讀 2897·2019-08-23 10:53