国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

flask 上下文的實現

lncwwn / 822人閱讀

摘要:值得注意的是這個對象在創建時,將實例的本身作為實參傳入自身,因此,。到這里想必已經很清楚了就是指對象就是對應每次請求創建的對象通過將與關聯起來總結創建了,這個對應的上下文,就是每響應一個請求,就會創建一個對象,這個對象對應的上下文,就是

引言

本文主要梳理了flask的current_app, request, session, g的實現原理

源碼說明

本文使用flask 0.5 版本

application context 和request context

flask有兩個context: application contextrequest context

application context request context
current_app request
g session

這里需要通俗地解釋一下application contextrequest 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通過_RequestContextappRequest關聯起來

總結

app = Flask(__name__)創建了application, 這個application對應的上下文,就是application context

Flask每響應一個http請求,就會創建一個Request對象,這個request對象對應的上下文,就是request context

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37717.html

相關文章

  • 一個Flask應用運行過程剖析

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

    shmily 評論0 收藏0
  • Flask請求下文和應用下文

    摘要:并且棧頂的元素都是的請求上下文和應用上下文之后,我們再在這個環境中嵌套的應用上下文。這時查看兩個棧的內容,發現兩個棧中只有的請求的請求上下文對象和應用上下文對象。而等一直指向棧頂的請求上下文對象,分別引用請求上下文的和。 在Flask中處理請求時,應用會生成一個請求上下文對象。整個請求的處理過程,都會在這個上下文對象中進行。這保證了請求的處理過程不被干擾。處理請求的具體代碼如下: de...

    sourcenode 評論0 收藏0
  • flask源碼走讀

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

    Coly 評論0 收藏0
  • Flask內置命令行工具—CLI

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

    nicercode 評論0 收藏0
  • 深入理解flask框架(2):應用下文與請求下文

    摘要:實現一個進程中擁有多個應用上下文機制依賴的數據結構上下文機制的實現基于的。 什么是上下文? flask框架中的上下文本質上就是兩個類,我們可以先看一下他的初始化函數:應用上下文 class AppContext(object): The application context binds an application object implicitly to the c...

    wushuiyong 評論0 收藏0

發表評論

0條評論

lncwwn

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<