1、談談你對flask上下文管理機制的理解?
首先說一下ThreadingLocal,對每個線程保存它的數據,但是flask爲了支持協程,自己封裝了一個Local對象,其中創建了一個字典,{greenlet加唯一標示:存數據},這樣可以保證數據隔離。
請求到來時:
1、把request,session,等請求相關的數據封裝到了RequestContext中,
2、再將RequestContext對象添加到Local中(通過localstack將請求數據添加到Local對象中);
執行視圖時:
1、使用request時,只要調用request方法,都會執行LocalProxy中對應的方法,在這些方法中都會調用_lookup_req_object函數,該函數會通過LocalStack去Local中獲取值,在RequestContext中獲取request或者session
請求結束時:會調用ctx.auto_pop,Local中的數據被移除。
Flask處理流程