成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解flask框架(4):session

PingCAP / 2418人閱讀

摘要:中的實現(xiàn)是基于。打開源碼的文件,我們可以看到最后的接口類中,主要有兩個函數(shù)。這個系列就此完結。

flask中session的實現(xiàn)是基于cookie。
打開flask源碼的session.py文件,我們可以看到最后的接口類中,主要有open_session,save_session兩個函數(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類中對session的接口進行了初始化,并在process_response函數(shù)中進行了調(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上下文進棧的時候會進行調(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)生的整個過程。
當調(diào)用的wsgi函數(shù)執(zhí)行到push時,

        ctx = self.request_context(environ)
        error = None
        try:
            try:
                ctx.push()

push函數(shù)判斷self.session是否為None,如果為None,則調(diào)用open_session進行初始化,這個過程等價于

self.session = self.session_class()

而session_class在SecureCookieSessionInterface中定義為

session_class = SecureCookieSession

而SecureCookieSession則是一個自定義的類實現(xiàn)了類似字典的接口,則此時可以理解為self.session = {},
之后在finalize_request函數(shù)中調(diào)用

response = self.process_response(response)
接下來
|
|
|
self.session_interface.save_session(self, ctx.session, response)
接下來
|
|
|
調(diào)用set_cookie對cookie進行設置
        response.set_cookie(
            app.session_cookie_name,
            val,
            expires=expires,
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure
        )

之后不會在寫了,blueprint類與第一章類似,而模板與信號部分因為當前的前后端分離的趨勢,以后用的應該越來越少。
這個系列就此完結。
以上。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/41242.html

相關文章

  • 深入理解flask框架(3):config與extension

    摘要:中的配置,都是通過來控制那么究竟是什么再來看函數(shù)而是什么再轉向看的源碼,可以看到類繼承于字典也就是說的就是一個特殊的字典,用于保存配置項。 config flask中的配置,都是通過config來控制那么config究竟是什么? self.config = self.make_config(instance_relative_config) 再來看make_config函數(shù): def ...

    wmui 評論0 收藏0
  • 深入理解flask框架(1):WSGI與路由

    摘要:是一個小而美的微框架,主要依賴于和,只建立和的橋梁,前者實現(xiàn)一個合適的應用,后者處理模板。本文主要分析了是在基礎上如何構建接口與路由系統(tǒng)的。網(wǎng)關協(xié)議的本質(zhì)是為了解耦,實現(xiàn)服務器和應用程序的分離,就是一個支持的服務器與應用程序之間的約定。 flask是一個小而美的微框架,主要依賴于Werkezug 和 Jinja2, Flask 只建立 Werkezug 和 Jinja2 的橋梁,前者實...

    xiaolinbang 評論0 收藏0
  • 深入理解flask框架(2):應用上下文與請求上下文

    摘要:實現(xiàn)一個進程中擁有多個應用上下文機制依賴的數(shù)據(jù)結構上下文機制的實現(xiàn)基于的。 什么是上下文? flask框架中的上下文本質(zhì)上就是兩個類,我們可以先看一下他的初始化函數(shù):應用上下文 class AppContext(object): The application context binds an application object implicitly to the c...

    wushuiyong 評論0 收藏0
  • 深入 Flask 源碼理解 Context

    摘要:主要的作用是將維護的字典中鍵為對應的值定義為。如果沒有,則會將當前到中,同時將加入列表中否則添加。注意清理之后的動作。上述代碼涉及到,它強調(diào)必須是一個可調(diào)用對象。后期的工作之一是了解。這僅僅是我的個人理解。實際上這是解決多個實例運行的問題。 Flask 中的上下文對象 知乎問題 編程中什么是「Context(上下文)」 已經(jīng)能夠簡單地說明什么是 Context,它是一個程序需要的外部對...

    ninefive 評論0 收藏0
  • flask文檔學習筆記1-快速入門

    摘要:示例如下靜態(tài)路由使用動態(tài)變量的路由未指定變量類型使用動態(tài)變量的路由指定變量類型指定的路由變量,可以作為被裝飾的函數(shù)參數(shù)傳入進來。 開始決定認真的在網(wǎng)上寫一些東西,主要原因還是在于希望能提升學習效果。雖說python寫了有幾年,但是web后端框架的確沒怎么接觸過,買了本狗書寥寥草草的過了一遍,發(fā)現(xiàn)很多東西還是理解不深,真的是好記性不如爛筆頭,知識也要從基礎開始,退回來好好看看官方文檔,再...

    lingdududu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<