摘要:值得注意的是這個對象在創建時,將實例的本身作為實參傳入自身,因此,。到這里想必已經很清楚了就是指對象就是對應每次請求創建的對象通過將與關聯起來總結創建了,這個對應的上下文,就是每響應一個請求,就會創建一個對象,這個對象對應的上下文,就是
引言
本文主要梳理了flask的current_app, request, session, g的實現原理
源碼說明本文使用flask 0.5 版本
application context 和request contextflask有兩個context: application context和request context
application context | request context | |
---|---|---|
current_app | request | |
g | session |
這里需要通俗地解釋一下application context與request context:
application 指的就是當你調用app = Flask(__name__)創建的這個對象app;
request 指的是每次http請求發生時,WSGI server(比如gunicorn)調用Flask.__call__()之后,在Flask對象內部創建的Request對象;
application 表示用于響應WSGI請求的應用本身,request 表示每次http請求;
application的生命周期大于request,一個application存活期間,可能發生多次http請求,所以,也就會有多個request
下面通過源碼了解一下 flask 如何實現這兩種context:
# 代碼摘選自flask 0.5 中的ctx.py文件, 進行了部分刪減 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類中,每次請求都會調用這個request_context函數。這個函數則會創建一個_RequestContext對象。
值得注意的是:這個對象在創建時,將Flask實例的本身作為實參傳入_RequestContext自身,因此,
self.app = Flask()。
所以,雖然每次http請求都會創建一個_RequestContext對象,但是,每次創建的時候都會將同一個Flask對象傳入該對象的app成員變量,使得:
由同一個Flask對象響應的請求所創建的_RequestContext對象的app成員變量都共享同一個application
通過在Flask對象中創建_RequestContext對象,并將Flask自身作為參數傳入_RequestContext對象的方式,實現了多個request context對應一個application context 的目的。
接下來,看self.request = app.request_class(environ)這句。
由于app成員變量就是app = Flask(__name__)這個對象,所以,app.request_class就是Flask.request_class。
在Flask類的定義中:
request_class = Request # Request 是一個類,定義如下: class Request(RequestBase): ...
所以:
self.request = app.request_class(environ)實際上是創建了一個Request對象。
由于,一個http請求對應一個_RequestContext對象的創建,而每個_RequestContext對象的創建對應一個Request對象的創建,所以,每個http請求對應一個Request對象。
到這里想必已經很清楚了:
application 就是指app = Flask(__name__)對象
request 就是對應每次http 請求創建的Request對象
flask通過_RequestContext將app與Request關聯起來
app = Flask(__name__)創建了application, 這個application對應的上下文,就是application context
Flask每響應一個http請求,就會創建一個Request對象,這個request對象對應的上下文,就是request context
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37717.html
摘要:本文就主要針對一個應用的運行過程進行簡要分析,后續文章還會對框架的一些具體問題進行分析。所有的請求處理過程,都會在這個上下文對象中進行。和一些全局變量注意當進入這個上下文對象時,會觸發。 相信很多初學Flask的同學(包括我自己),在閱讀官方文檔或者Flask的學習資料時,對于它的認識是從以下的一段代碼開始的: from flask import Flask app = Flask(...
摘要:并且棧頂的元素都是的請求上下文和應用上下文之后,我們再在這個環境中嵌套的應用上下文。這時查看兩個棧的內容,發現兩個棧中只有的請求的請求上下文對象和應用上下文對象。而等一直指向棧頂的請求上下文對象,分別引用請求上下文的和。 在Flask中處理請求時,應用會生成一個請求上下文對象。整個請求的處理過程,都會在這個上下文對象中進行。這保證了請求的處理過程不被干擾。處理請求的具體代碼如下: de...
摘要:如果設置為,命令將激活模式,執行會啟用交互式調試器和代碼自動重載。也可以通過變量單獨控制,表示啟用,表示禁用通過設置環境變量略通過設置環境變量略自定義命令命令基于庫實現。 應用發現 flask命令在Flask庫安裝后可使用,使用前需要正確配置FLASK_APP環境變量以告知用戶程序所在位置。不同平臺設置方式有所不同。 Unix Bash (Linux, Mac, etc.): $ ex...
摘要:實現一個進程中擁有多個應用上下文機制依賴的數據結構上下文機制的實現基于的。 什么是上下文? flask框架中的上下文本質上就是兩個類,我們可以先看一下他的初始化函數:應用上下文 class AppContext(object): The application context binds an application object implicitly to the c...
閱讀 1362·2019-08-30 15:55
閱讀 1652·2019-08-26 10:21
閱讀 3442·2019-08-23 18:28
閱讀 3380·2019-08-23 15:38
閱讀 748·2019-08-23 15:24
閱讀 2142·2019-08-23 13:59
閱讀 780·2019-08-23 11:31
閱讀 2874·2019-08-23 10:53