成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

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

PingCAP / 2471人閱讀

摘要:中的實(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ān)文章

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

    摘要:中的配置,都是通過(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 ...

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

    摘要:是一個(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í)...

    xiaolinbang 評(píng)論0 收藏0
  • 深入理解flask框架(2):應(yīng)用上下文與請(qǐng)求上下文

    摘要:實(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...

    wushuiyong 評(píng)論0 收藏0
  • 深入 Flask 源碼理解 Context

    摘要:主要的作用是將維護(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ì)...

    ninefive 評(píng)論0 收藏0
  • flask文檔學(xué)習(xí)筆記1-快速入門(mén)

    摘要:示例如下靜態(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)好好看看官方文檔,再...

    lingdududu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<