Flask源碼流程梳理

這裏主要分析Flask對象實例化後,整個應用的啓動過程都發生了什麼。

1.執行app.__call__方法:

clipboard.png

2.執行app.wsgi_app():

clipboard.png

這一步都作了什麼?
self.request_content(environ)

clipboard.png

實例化RequestContext對象

clipboard.png
1處作了什麼?
調用 app.create_url_adapter 方法,把 app 的 url_map 綁定到 WSGI environ 變量上。cookie

clipboard.png

最後會調用 match_request 方法,這個方法調用了 url_adapter.match 方法,進行實際的匹配工做,返回匹配的 url rule。session

clipboard.png

定義與request相關的g變量
說明:處理請求時用做臨時存儲的對象(Appcontext類型)app

接下來執行RequestContext對象的push方法:加密

clipboard.png

分析:url

1剛開始是None;
2.實例化APPContext對象
3.執行APPcontext對象的push方法

clipboard.png

建立LocalStack對象,也就是建立一個棧,把AppContext對象壓入棧中
而後:spa

clipboard.png

把RequestContext對象壓入到LocalStack中(和上面是兩個棧)翻譯

push方法都作了什麼?3d

clipboard.png

.......夜深了,回頭補充code

緊接着:對象

clipboard.png

執行Flask對象的open_opensession()方法
調用了app的open_session:

SecureCookieSessionInterface().open_session()
   接着看都作了什麼?

def open_session(self, app, request):

#獲取加解密對象
s = self.get_signing_serializer(app)
if s is None:
    return None
# 從cookies中獲取cookie的名字:'session'
val = request.cookies.get(app.session_cookie_name)
if not val:
    #若是val爲空,則返回SecureCookieSession對象,至關於{}
    #session_class = SecureCookieSession
    return self.session_class()
max_age = total_seconds(app.permanent_session_lifetime)
try:
    # 解密返回原始數據
    data = s.loads(val, max_age=max_age)
    #session_class = SecureCookieSession至關於{},根據代碼追溯能夠發現,基類繼承dict
    #"""Base class for sessions based on signed cookies."""
    #翻譯一下:基於加密cookies的session基類
    return self.session_class(data)
except BadSignature:
    return self.session_class()

3.接下來執行:

clipboard.png

未完....

相關文章
相關標籤/搜索