摘要:中的實(shí)現(xiàn)是基于。打開(kāi)源碼的文件,我們可以看到最后的接口類(lèi)中,主要有兩個(gè)函數(shù)。這個(gè)系列就此完結(jié)。
flask中session的實(shí)現(xiàn)是基于cookie。
打開(kāi)flask源碼的session.py文件,我們可以看到最后的接口類(lèi)中,主要有open_session,save_session兩個(gè)函數(shù)。
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類(lèi)中對(duì)session的接口進(jìn)行了初始化,并在process_response函數(shù)中進(jìn)行了調(diào)用,但是只有save_session接口,那么open_session接口在哪里被調(diào)用呢?
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上下文進(jìn)棧的時(shí)候會(huì)進(jìn)行調(diào)用
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產(chǎn)生的整個(gè)過(guò)程。
當(dāng)調(diào)用的wsgi函數(shù)執(zhí)行到push時(shí),
ctx = self.request_context(environ) error = None try: try: ctx.push()
push函數(shù)判斷self.session是否為None,如果為None,則調(diào)用open_session進(jìn)行初始化,這個(gè)過(guò)程等價(jià)于
self.session = self.session_class()
而session_class在SecureCookieSessionInterface中定義為
session_class = SecureCookieSession
而SecureCookieSession則是一個(gè)自定義的類(lèi)實(shí)現(xiàn)了類(lèi)似字典的接口,則此時(shí)可以理解為self.session = {},
之后在finalize_request函數(shù)中調(diào)用
response = self.process_response(response) 接下來(lái) | | | self.session_interface.save_session(self, ctx.session, response) 接下來(lái) | | | 調(diào)用set_cookie對(duì)cookie進(jìn)行設(shè)置 response.set_cookie( app.session_cookie_name, val, expires=expires, httponly=httponly, domain=domain, path=path, secure=secure )
之后不會(huì)在寫(xiě)了,blueprint類(lèi)與第一章類(lèi)似,而模板與信號(hào)部分因?yàn)楫?dāng)前的前后端分離的趨勢(shì),以后用的應(yīng)該越來(lái)越少。
這個(gè)系列就此完結(jié)。
以上。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/41242.html
摘要:中的配置,都是通過(guò)來(lái)控制那么究竟是什么再來(lái)看函數(shù)而是什么再轉(zhuǎn)向看的源碼,可以看到類(lèi)繼承于字典也就是說(shuō)的就是一個(gè)特殊的字典,用于保存配置項(xiàng)。 config flask中的配置,都是通過(guò)config來(lái)控制那么config究竟是什么? self.config = self.make_config(instance_relative_config) 再來(lái)看make_config函數(shù): def ...
摘要:是一個(gè)小而美的微框架,主要依賴于和,只建立和的橋梁,前者實(shí)現(xiàn)一個(gè)合適的應(yīng)用,后者處理模板。本文主要分析了是在基礎(chǔ)上如何構(gòu)建接口與路由系統(tǒng)的。網(wǎng)關(guān)協(xié)議的本質(zhì)是為了解耦,實(shí)現(xiàn)服務(wù)器和應(yīng)用程序的分離,就是一個(gè)支持的服務(wù)器與應(yīng)用程序之間的約定。 flask是一個(gè)小而美的微框架,主要依賴于Werkezug 和 Jinja2, Flask 只建立 Werkezug 和 Jinja2 的橋梁,前者實(shí)...
摘要:實(shí)現(xiàn)一個(gè)進(jìn)程中擁有多個(gè)應(yīng)用上下文機(jī)制依賴的數(shù)據(jù)結(jié)構(gòu)上下文機(jī)制的實(shí)現(xiàn)基于的。 什么是上下文? flask框架中的上下文本質(zhì)上就是兩個(gè)類(lèi),我們可以先看一下他的初始化函數(shù):應(yīng)用上下文 class AppContext(object): The application context binds an application object implicitly to the c...
摘要:主要的作用是將維護(hù)的字典中鍵為對(duì)應(yīng)的值定義為。如果沒(méi)有,則會(huì)將當(dāng)前到中,同時(shí)將加入列表中否則添加。注意清理之后的動(dòng)作。上述代碼涉及到,它強(qiáng)調(diào)必須是一個(gè)可調(diào)用對(duì)象。后期的工作之一是了解。這僅僅是我的個(gè)人理解。實(shí)際上這是解決多個(gè)實(shí)例運(yùn)行的問(wèn)題。 Flask 中的上下文對(duì)象 知乎問(wèn)題 編程中什么是「Context(上下文)」 已經(jīng)能夠簡(jiǎn)單地說(shuō)明什么是 Context,它是一個(gè)程序需要的外部對(duì)...
摘要:示例如下靜態(tài)路由使用動(dòng)態(tài)變量的路由未指定變量類(lèi)型使用動(dòng)態(tài)變量的路由指定變量類(lèi)型指定的路由變量,可以作為被裝飾的函數(shù)參數(shù)傳入進(jìn)來(lái)。 開(kāi)始決定認(rèn)真的在網(wǎng)上寫(xiě)一些東西,主要原因還是在于希望能提升學(xué)習(xí)效果。雖說(shuō)python寫(xiě)了有幾年,但是web后端框架的確沒(méi)怎么接觸過(guò),買(mǎi)了本狗書(shū)寥寥草草的過(guò)了一遍,發(fā)現(xiàn)很多東西還是理解不深,真的是好記性不如爛筆頭,知識(shí)也要從基礎(chǔ)開(kāi)始,退回來(lái)好好看看官方文檔,再...
閱讀 4001·2021-09-27 13:36
閱讀 4757·2021-09-22 15:12
閱讀 3183·2021-09-13 10:29
閱讀 1922·2021-09-10 10:50
閱讀 2482·2021-09-03 10:43
閱讀 616·2019-08-29 17:10
閱讀 509·2019-08-26 13:52
閱讀 3365·2019-08-23 14:37