国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flask中的session介紹

這篇具有很好參考價(jià)值的文章主要介紹了flask中的session介紹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

flask中的session介紹,flask,python,flask,python,后端

flask中的session介紹

在Flask中,session是一個(gè)用于存儲(chǔ)特定用戶會(huì)話數(shù)據(jù)的字典對(duì)象。它在不同請(qǐng)求之間保存數(shù)據(jù)。它通過在客戶端設(shè)置一個(gè)簽名的cookie,將所有的會(huì)話數(shù)據(jù)存儲(chǔ)在客戶端。以下是如何在Flask應(yīng)用中使用session的基本步驟:

首先,你需要設(shè)置一個(gè)秘鑰,這是為了加密你的session數(shù)據(jù):

from flask import Flask, session

app = Flask(__name__)

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

然后,你可以像操作字典一樣操作session對(duì)象。以下是一個(gè)登錄的例子:

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'


#from flask import escape
# 假設(shè) session['username'] 是 "<script>alert('hacked!');</script>"
#safe_username = escape(session['username'])
# safe_username 現(xiàn)在是 "&lt;script&gt;alert('hacked!');&lt;/script&gt;"
# escape(session['username'])是在做HTML轉(zhuǎn)義

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if valid_login(username, password):
            session['username'] = request.form['username']
            return redirect(url_for('index'))
        else:
            error = 'Invalid username or password'
    return render_template('login.html', error=error)


@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

Flask的session實(shí)現(xiàn)涉及到幾個(gè)關(guān)鍵的組件:session對(duì)象、session_interface對(duì)象以及secure_cookie模塊。以下是這些組件是如何工作以實(shí)現(xiàn)Flask的session的:

  1. Session對(duì)象:在Flask中,session被表示為一個(gè)名為session的字典對(duì)象。它是LocalProxy的實(shí)例,LocalProxy是一種可以動(dòng)態(tài)引用當(dāng)前運(yùn)行環(huán)境(比如請(qǐng)求或應(yīng)用上下文)的特定對(duì)象的代理類。當(dāng)你嘗試訪問session對(duì)象的屬性或方法時(shí),LocalProxy會(huì)將這些操作轉(zhuǎn)發(fā)到實(shí)際的會(huì)話對(duì)象,這個(gè)實(shí)際的會(huì)話對(duì)象由session_interface創(chuàng)建。
  2. SessionInterface對(duì)象SessionInterface是一個(gè)抽象基類,定義了用于處理session的接口。Flask自帶的SecureCookieSessionInterface實(shí)現(xiàn)了這個(gè)接口,使用安全的簽名cookie來存儲(chǔ)session數(shù)據(jù)。當(dāng)一個(gè)請(qǐng)求開始時(shí),SecureCookieSessionInterface會(huì)從請(qǐng)求的cookies中提取出session數(shù)據(jù),并創(chuàng)建一個(gè)新的SecureCookieSession對(duì)象。當(dāng)請(qǐng)求結(jié)束時(shí),如果SecureCookieSession對(duì)象被修改,SecureCookieSessionInterface會(huì)把它序列化并簽名,然后存回到客戶端的cookies中。【文末附源碼解釋】
  3. SecureCookie模塊:這個(gè)模塊實(shí)現(xiàn)了SecureCookieSession類,SecureCookieSession是一個(gè)用于存儲(chǔ)實(shí)際session數(shù)據(jù)的字典子類,它的工作方式和普通的字典一樣。

整體來看,F(xiàn)lask的session實(shí)現(xiàn)工作流程是這樣的:

  • 當(dāng)一個(gè)請(qǐng)求開始時(shí),F(xiàn)lask會(huì)創(chuàng)建一個(gè)新的請(qǐng)求上下文,并通過SecureCookieSessionInterface從請(qǐng)求的cookies中提取出session數(shù)據(jù),然后創(chuàng)建一個(gè)新的SecureCookieSession對(duì)象。
  • 當(dāng)你在你的視圖函數(shù)中操作session對(duì)象(比如設(shè)置session['username'] = 'John')時(shí),實(shí)際上你是在操作這個(gè)SecureCookieSession對(duì)象。
  • 當(dāng)請(qǐng)求結(jié)束時(shí),F(xiàn)lask會(huì)檢查SecureCookieSession對(duì)象是否被修改。如果被修改,F(xiàn)lask會(huì)通過SecureCookieSessionInterfaceSecureCookieSecureCookieSession對(duì)象序列化并簽名,然后把它存回到響應(yīng)的cookies中。
  • 當(dāng)下一個(gè)請(qǐng)求來到時(shí),這個(gè)過程會(huì)再次重復(fù)。

通常流程總結(jié)

  1. 當(dāng)一個(gè)新用戶(沒有任何session數(shù)據(jù)的用戶)首次訪問你的Flask應(yīng)用時(shí),他們的請(qǐng)求中不會(huì)包含任何session數(shù)據(jù)。在這種情況下,F(xiàn)lask會(huì)為這個(gè)用戶創(chuàng)建一個(gè)新的、空的session對(duì)象。這個(gè)新的session對(duì)象在初始狀態(tài)下是空的,也就是說,它不包含任何數(shù)據(jù)。
  2. 如果在處理這個(gè)請(qǐng)求的過程中,你的代碼修改了session對(duì)象(例如,通過設(shè)置session['username'] = 'John'),那么當(dāng)請(qǐng)求結(jié)束時(shí),F(xiàn)lask會(huì)把這個(gè)session對(duì)象序列化并簽名,然后存入一個(gè)新的Cookie中。這個(gè)新的Cookie會(huì)被發(fā)送到客戶端,一起與響應(yīng)一起傳送。
  3. 當(dāng)這個(gè)用戶下次訪問你的Flask應(yīng)用時(shí),他們的請(qǐng)求將會(huì)攜帶這個(gè)包含了session數(shù)據(jù)的Cookie。Flask會(huì)在接收到這個(gè)請(qǐng)求時(shí),從Cookie中提取出session數(shù)據(jù),并創(chuàng)建一個(gè)新的session對(duì)象。這樣,你的代碼就可以繼續(xù)訪問和修改這個(gè)session對(duì)象了。

需要注意的是,如果一個(gè)請(qǐng)求沒有修改session對(duì)象,那么Flask就不會(huì)在響應(yīng)中設(shè)置新的Cookie。這是因?yàn)?,沒有必要把一個(gè)沒有變化的session數(shù)據(jù)再次發(fā)送到客戶端。

因此,即使一個(gè)新用戶的首次請(qǐng)求中沒有包含任何session數(shù)據(jù),F(xiàn)lask也能正確地處理

SecureCookieSessionInterface

class SecureCookieSessionInterface(SessionInterface):
    """The default session interface that stores sessions in signed cookies
    through the :mod:`itsdangerous` module.
    """

    #: the salt that should be applied on top of the secret key for the
    #: signing of cookie based sessions.
    salt = "cookie-session"
    #: the hash function to use for the signature.  The default is sha1
    digest_method = staticmethod(hashlib.sha1)
    #: the name of the itsdangerous supported key derivation.  The default
    #: is hmac.
    key_derivation = "hmac"
    #: A python serializer for the payload.  The default is a compact
    #: JSON derived serializer with support for some extra Python types
    #: such as datetime objects or tuples.
    serializer = session_json_serializer
    session_class = SecureCookieSession

    def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None:
        if not app.secret_key:
            return None
        signer_kwargs = dict(
            key_derivation=self.key_derivation, digest_method=self.digest_method
        )
        return URLSafeTimedSerializer(
            app.secret_key,
            salt=self.salt,
            serializer=self.serializer,
            signer_kwargs=signer_kwargs,
        )

    def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None:
        s = self.get_signing_serializer(app)
        if s is None:
            return None
        val = request.cookies.get(self.get_cookie_name(app))
        if not val:
            return self.session_class()
        # 獲取session的最大有效期,單位為秒。
        max_age = int(app.permanent_session_lifetime.total_seconds())
        try:
            # 嘗試使用序列化器s的loads方法,對(duì)session cookie的值val進(jìn)行反序列化和簽名驗(yàn)證。如果反序列化和驗(yàn)證成功,就用這些數(shù)據(jù)創(chuàng)建一個(gè)新的session對(duì)象,并返回
            data = s.loads(val, max_age=max_age)
            return self.session_class(data)
        except BadSignature:
            return self.session_class()

    def save_session(
        self, app: Flask, session: SessionMixin, response: Response
    ) -> None:
        name = self.get_cookie_name(app)
        domain = self.get_cookie_domain(app)
        path = self.get_cookie_path(app)
        secure = self.get_cookie_secure(app)
        samesite = self.get_cookie_samesite(app)
        httponly = self.get_cookie_httponly(app)

        # Add a "Vary: Cookie" header if the session was accessed at all.
        if session.accessed:
            response.vary.add("Cookie")

        # 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(
                    name,
                    domain=domain,
                    path=path,
                    secure=secure,
                    samesite=samesite,
                    httponly=httponly,
                )
                response.vary.add("Cookie")

            return

        if not self.should_set_cookie(app, session):
            return

        expires = self.get_expiration_time(app, session)
        val = self.get_signing_serializer(app).dumps(dict(session))  # type: ignore
        response.set_cookie(
            name,
            val,  # type: ignore
            expires=expires,
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure,
            samesite=samesite,
        )
        response.vary.add("Cookie")

  1. SecureCookieSessionInterface類:這個(gè)類實(shí)現(xiàn)了session接口,使用安全的簽名cookies來存儲(chǔ)session數(shù)據(jù)。
  2. 類屬性:
    • salt:加鹽值,用于混淆session的加密過程,增加安全性。
    • digest_method:哈希函數(shù),用于簽名過程中對(duì)數(shù)據(jù)進(jìn)行哈希處理,默認(rèn)為sha1。
    • key_derivation:關(guān)鍵字派生,設(shè)置為"hmac",表示使用HMAC進(jìn)行簽名。
    • serializer:序列化器,用于將Python對(duì)象轉(zhuǎn)換為可以在網(wǎng)絡(luò)上傳輸?shù)母袷剑@里使用的是JSON序列化器。
    • session_class:表示session的類,默認(rèn)為SecureCookieSession。
  3. get_signing_serializer方法:用于獲取一個(gè)簽名序列化器,其作用是用來簽名和反簽名cookies的。如果應(yīng)用沒有設(shè)置秘鑰app.secret_key,則返回None。
  4. open_session方法:在處理每個(gè)請(qǐng)求時(shí)調(diào)用,從請(qǐng)求的cookies中提取出session數(shù)據(jù),反序列化并驗(yàn)證簽名,得到session的數(shù)據(jù)。如果簽名不合法,就會(huì)拋出BadSignature異常,然后返回一個(gè)空的session。
  5. save_session方法:在每個(gè)請(qǐng)求處理完后調(diào)用,將session數(shù)據(jù)序列化,簽名,然后存入到響應(yīng)的cookies中。如果session為空且已被修改,則刪除cookie。只有當(dāng)session被訪問過或被修改,才會(huì)設(shè)置Vary: Cookie頭。

在使用SecureCookieSessionInterface處理session時(shí),F(xiàn)lask會(huì)保證session的安全性,即使session數(shù)據(jù)存儲(chǔ)在客戶端的cookies中,也無法被篡改,因?yàn)槊總€(gè)session cookie都被簽名了。除非知道服務(wù)器的秘鑰,否則無法偽造有效的session cookie。文章來源地址http://www.zghlxwxcb.cn/news/detail-611899.html

到了這里,關(guān)于flask中的session介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python - flask后端開發(fā)筆記

    ? Flask入門 有一篇很全面的博客可以參考:Python Flask Web 框架入門 跨域問題處理 文件發(fā)送 ?

    2024年02月07日
    瀏覽(25)
  • flask中的werkzeug介紹

    flask中的werkzeug介紹

    flask中的werkzeug Werkzeug是一個(gè)Python庫,用于開發(fā)Web應(yīng)用程序。它是一個(gè)WSGI(Web Server Gateway Interface)工具包,提供了一系列實(shí)用功能來幫助開發(fā)者處理HTTP請(qǐng)求、響應(yīng)、URLs等等。Werkzeug的設(shè)計(jì)非常靈活,可以用作構(gòu)建各種Web框架的基礎(chǔ)。 Werkzeug的特性包括: 請(qǐng)求和響應(yīng)對(duì)象:W

    2024年02月16日
    瀏覽(8)
  • flask中的cookies介紹

    flask中的cookies介紹

    flask中的cookies介紹 “Cookie” 在 web 開發(fā)中是一種非常重要的技術(shù),用于在客戶端(即用戶的瀏覽器)存儲(chǔ)信息,以便在多個(gè)頁面和多個(gè)訪問會(huì)話之間保持狀態(tài)。Cookies 通常用于記住用戶的登錄信息,跟蹤用戶在站點(diǎn)上的瀏覽行為,以及其他需要記住的設(shè)置或選擇。 在 Flask 中

    2024年02月15日
    瀏覽(6)
  • Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket

    Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket

    后端向前端推送信息,通知任務(wù)完成 輪詢 SSE WebSocket 請(qǐng)求方式 HTTP HTTP TCP長連接 觸發(fā)方式 輪詢 事件 事件 優(yōu)點(diǎn) 實(shí)現(xiàn)簡單易兼容 實(shí)現(xiàn)簡單開發(fā)成本低 全雙工通信,開銷小,安全,可擴(kuò)展 缺點(diǎn) 消耗較大 不兼容IE 傳輸數(shù)據(jù)需二次解析,開發(fā)成本大 適用場(chǎng)景 服務(wù)端向客戶端單向

    2023年04月19日
    瀏覽(50)
  • (二十六)Flask之原生session切為flask-session

    ????作者介紹:【孤寒者】—CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領(lǐng)域博主、CSDN原力計(jì)劃作者 ???? 本文已收錄于Flask框架從入門到實(shí)戰(zhàn)專欄 :

    2024年04月11日
    瀏覽(17)
  • 【python】flask模板渲染引擎Jinja2,通過后端數(shù)據(jù)渲染前端頁面

    【python】flask模板渲染引擎Jinja2,通過后端數(shù)據(jù)渲染前端頁面

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習(xí)慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構(gòu)師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。 ??《博客》:Python全棧,前后端開

    2024年04月11日
    瀏覽(47)
  • 〖Python網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)⑤〗- Session和Cookie介紹

    訂閱:新手可以訂閱我的其他專欄。免費(fèi)階段訂閱量1000+ ????????????????python項(xiàng)目實(shí)戰(zhàn) ???????????????? Python編程基礎(chǔ)教程系列(零基礎(chǔ)小白搬磚逆襲) 說明:本專欄持續(xù)更新中,目前專欄免費(fèi)訂閱,在轉(zhuǎn)為付費(fèi)專欄前訂閱本專欄的,可以免費(fèi)訂閱付費(fèi)專欄,

    2023年04月09日
    瀏覽(52)
  • 了解Python中的requests.Session對(duì)象及其用途

    了解Python中的requests.Session對(duì)象及其用途

    在Python的網(wǎng)絡(luò)編程中,requests庫是一個(gè)非常流行的HTTP客戶端庫,用于發(fā)送各種類型的HTTP請(qǐng)求。在requests庫中,requests.Session對(duì)象提供了一種在多個(gè)請(qǐng)求之間保持狀態(tài)的方法本文將探討Python中的requests.Session對(duì)象及其用途,以幫助開發(fā)人員更好地利用這一功能。 什么是requests.Ses

    2024年02月02日
    瀏覽(15)
  • (二十四)Flask之flask-session組件

    ????作者介紹:【孤寒者】—CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領(lǐng)域博主、CSDN原力計(jì)劃作者 ???? 本文已收錄于Flask框架從入門到實(shí)戰(zhàn)專欄 :《Flask框架從入門到實(shí)戰(zhàn)》 ???? 熱門專欄推薦 :《Python全棧系列教程》、《爬蟲從入門到精通系列

    2024年03月17日
    瀏覽(18)
  • flask-----請(qǐng)求和響應(yīng),session

    ?1 所有web:請(qǐng)求對(duì)象,響應(yīng)對(duì)象(go,java,ptyhon) 2 flask請(qǐng)求對(duì)象,全局的request 3 flask的響應(yīng) 4?session flask中是全局session session的運(yùn)行機(jī)制 源碼分析,看運(yùn)行機(jī)制

    2024年02月14日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包