摘要:中的實現是基于。打開源碼的文件,我們可以看到最后的接口類中,主要有兩個函數。這個系列就此完結。
flask中session的實現是基于cookie。
打開flask源碼的session.py文件,我們可以看到最后的接口類中,主要有open_session,save_session兩個函數。
class SecureCookieSessionInterface(SessionInterface): ..... def open_session(self, app, request): s = self.get_signing_serializer(app) if s is None: return None val = request.cookies.get(app.session_cookie_name) if not val: return self.session_class() max_age = total_seconds(app.permanent_session_lifetime) try: data = s.loads(val, max_age=max_age) return self.session_class(data) except BadSignature: return self.session_class() def save_session(self, app, session, response): domain = self.get_cookie_domain(app) path = self.get_cookie_path(app) # If the session is modified to be empty, remove the cookie. # If the session is empty, return without setting the cookie. if not session: if session.modified: response.delete_cookie( app.session_cookie_name, domain=domain, path=path ) return # Add a "Vary: Cookie" header if the session was accessed at all. if session.accessed: response.vary.add("Cookie") if not self.should_set_cookie(app, session): return httponly = self.get_cookie_httponly(app) secure = self.get_cookie_secure(app) expires = self.get_expiration_time(app, session) val = self.get_signing_serializer(app).dumps(dict(session)) response.set_cookie( app.session_cookie_name, val, expires=expires, httponly=httponly, domain=domain, path=path, secure=secure )
Flask類中對session的接口進行了初始化,并在process_response函數中進行了調用,但是只有save_session接口,那么open_session接口在哪里被調用呢?
session_interface = SecureCookieSessionInterface() def process_response(self, response): ..... if not self.session_interface.is_null_session(ctx.session): self.session_interface.save_session(self, ctx.session, response) .....
答案就是在request上下文進棧的時候會進行調用
class RequestContext(object): … self.session = None … def push(self): .... if self.session is None: session_interface = self.app.session_interface self.session = session_interface.open_session( self.app, self.request ) if self.session is None: self.session = session_interface.make_null_session(self.app)
這樣我們可以梳理一下flask中session產生的整個過程。
當調用的wsgi函數執行到push時,
ctx = self.request_context(environ) error = None try: try: ctx.push()
push函數判斷self.session是否為None,如果為None,則調用open_session進行初始化,這個過程等價于
self.session = self.session_class()
而session_class在SecureCookieSessionInterface中定義為
session_class = SecureCookieSession
而SecureCookieSession則是一個自定義的類實現了類似字典的接口,則此時可以理解為self.session = {},
之后在finalize_request函數中調用
response = self.process_response(response) 接下來 | | | self.session_interface.save_session(self, ctx.session, response) 接下來 | | | 調用set_cookie對cookie進行設置 response.set_cookie( app.session_cookie_name, val, expires=expires, httponly=httponly, domain=domain, path=path, secure=secure )
之后不會在寫了,blueprint類與第一章類似,而模板與信號部分因為當前的前后端分離的趨勢,以后用的應該越來越少。
這個系列就此完結。
以上。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41242.html
摘要:中的配置,都是通過來控制那么究竟是什么再來看函數而是什么再轉向看的源碼,可以看到類繼承于字典也就是說的就是一個特殊的字典,用于保存配置項。 config flask中的配置,都是通過config來控制那么config究竟是什么? self.config = self.make_config(instance_relative_config) 再來看make_config函數: def ...
摘要:是一個小而美的微框架,主要依賴于和,只建立和的橋梁,前者實現一個合適的應用,后者處理模板。本文主要分析了是在基礎上如何構建接口與路由系統的。網關協議的本質是為了解耦,實現服務器和應用程序的分離,就是一個支持的服務器與應用程序之間的約定。 flask是一個小而美的微框架,主要依賴于Werkezug 和 Jinja2, Flask 只建立 Werkezug 和 Jinja2 的橋梁,前者實...
摘要:實現一個進程中擁有多個應用上下文機制依賴的數據結構上下文機制的實現基于的。 什么是上下文? flask框架中的上下文本質上就是兩個類,我們可以先看一下他的初始化函數:應用上下文 class AppContext(object): The application context binds an application object implicitly to the c...
摘要:主要的作用是將維護的字典中鍵為對應的值定義為。如果沒有,則會將當前到中,同時將加入列表中否則添加。注意清理之后的動作。上述代碼涉及到,它強調必須是一個可調用對象。后期的工作之一是了解。這僅僅是我的個人理解。實際上這是解決多個實例運行的問題。 Flask 中的上下文對象 知乎問題 編程中什么是「Context(上下文)」 已經能夠簡單地說明什么是 Context,它是一個程序需要的外部對...
摘要:示例如下靜態路由使用動態變量的路由未指定變量類型使用動態變量的路由指定變量類型指定的路由變量,可以作為被裝飾的函數參數傳入進來。 開始決定認真的在網上寫一些東西,主要原因還是在于希望能提升學習效果。雖說python寫了有幾年,但是web后端框架的確沒怎么接觸過,買了本狗書寥寥草草的過了一遍,發現很多東西還是理解不深,真的是好記性不如爛筆頭,知識也要從基礎開始,退回來好好看看官方文檔,再...
閱讀 3889·2021-09-27 13:36
閱讀 4603·2021-09-22 15:12
閱讀 3068·2021-09-13 10:29
閱讀 1838·2021-09-10 10:50
閱讀 2369·2021-09-03 10:43
閱讀 526·2019-08-29 17:10
閱讀 449·2019-08-26 13:52
閱讀 3260·2019-08-23 14:37