Flask提供了兩種上下文,一種是應用上下文(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中有四種請求hook,分別是@before_first_request @before_request @after_request @teardown_request
Flask是一個基於WerkZeug實現的框架,所以Flask的App Context和Request Context是基於WerkZeug的Local Stack的實現。
這兩種上下文對象類定義在flask.ctx中,ctx.push會將當前的上下文對象壓棧壓入
flask._request_ctx_stack
中,
這個_request_ctx_stack一樣也是個Thread Local對象,也就是在每一個線程中都不同,上下文壓入棧後,再次請求的時候都是經過_request_ctx_stack.top在棧的頂端取
,所取到的永遠是屬於本身線程的對象,這樣不一樣線程之間的上下文就作到了隔離。請求結束後,線程退出,ThreadLocal本地變量也隨即銷燬
,而後調用ctx.pop()彈出上下文對象並回收內存。