Flask源碼剖析二之本地棧的建立

flask利用threading.Local以及flask自定義的Local來管理上下文對象。flask 實(shí)例起動后會初始化2個(gè)Local棧,一個(gè)是請求上下文棧一個(gè)是應(yīng)用上下文棧。Flask的上下文對象會保存在屬于自己的Local棧里。在Local棧里對象是以線程ID或協(xié)程ID進(jìn)行隔離的。
flask.globals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
本文以_request_ctx_stack為例,分析上下文棧的建立過程
werkzeug.local. LocalStack
class LocalStack(object):
def init(self):
self._local = Local()
LocalStack類的構(gòu)造方法中是對Local類的實(shí)例化。

class Local(object):
    __slots__ = ("__storage__", "__ident_func__")

    def __init__(self):
        object.__setattr__(self, "__storage__", {})
        object.__setattr__(self, "__ident_func__", get_ident)

Local 類實(shí)例化過程實(shí)現(xiàn)了一個(gè)字典,get_ident可以得到當(dāng)前線程或協(xié)程ID。這樣_request_ctx_stack = LocalStack(),_request_ctx_stack對象在app實(shí)例初始化之初其實(shí)就是一個(gè)空的字典_request_ctx_stack = {} 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容