【问题标题】:Some questions about Flask sessions关于 Flask 会话的一些问题
【发布时间】:2016-01-11 19:54:45
【问题描述】:

考虑以下简单的烧瓶应用:

from flask import Flask, request, session

application = Flask(__name__)
application.secret_key = "some_random_string"

@application.route("/enter_string")
def start_session():
    session["string"] = request.args["string"]

@application.route("/get_string")
def continue_session():
    if "string" not in session:
        return "Give me a string first!"

    return "You entered " + session["string"]

if __name__ == "__main__":
    application.debug = True
    application.run()

这是我的问题:

  1. 一旦访问了“enter_string”端点并且用户将字符串分配给session["string"],该字符串存储在哪里?它是在服务器的内存中还是在用户的内存中?
  2. 默认情况下,会话在浏览器退出时过期。是否有一种简单的方法可以让其他一些事件触发会话到期,例如关闭窗口但不一定关闭浏览器?
  3. 默认情况下,会话是否会超时,或者会一直保持到浏览器退出,无论需要多长时间?

【问题讨论】:

    标签: python session flask


    【解决方案1】:

    Flask 中的会话可以以不同的方式实现。默认实现基于安全 cookie(具有防止篡改的加密签名的 cookie)。以下是您对此实施的问题的答案:

    1. 字符串将存储在客户端 cookie 中。每次浏览器向服务器发送请求时,cookie都会随之发送。

    2. 客户端可以通过使用 Javascript 删除 cookie 来销毁会话。 (会话 cookie 的默认名称是 session)。服务器可以通过删除会话中的所有项目来删除会话。

    3. 在默认实现中,cookie 的到期日期设置为未来 31 天。这可以通过PERMANENT_SESSION_LIFETIME 配置设置进行更改。

    如上所述,Flask 支持第三方会话处理程序,因此上述答案可能不适用于其他实现。特别是,有一些实现服务器端会话的处理程序(例如 Flask-Session 或 Flask-KVSession)将会话数据存储在服务器而不是客户端中。

    【讨论】:

    • 当谈到这里的会话时,我会表现出我的绿色,但我对会话的印象是它通常是一个哈希值,它在本地存储为您的 cookie,然后从服务器获取......我不知道会话将全部数据存储在本地...
    • @JoranBeasley 您描述的实现被广泛使用,但这不是 Flask 默认所做的。如果您使用诸如Flask-Session 之类的服务器端扩展,那么 Flask 会像您说的那样将会话哈希存储在 cookie 中。
    • 这太好了,谢谢!如果您不介意后续问题(对于默认会话实现):非本地 Python 对象如何存储在客户端 cookie 中? IE。如果我将 Foo 类的实例分配给 session["foo_instance"],那么 cookie 的内容是如何确定的?
    • @PaulSiegel 非常好的问题。会话数据在 cookie 中被序列化为 JSON,因此您写入会话的任何内容都必须是 JSON 可序列化的。如果你需要支持非标准对象,你可以给 Flask 自己的 JSON 编码器/解码器。
    • 感谢您的帮助!我通过手动删除会话cookie客户端来测试您的答案,果然服务器丢失了会话。我能够毫无困难地绑定一些相当复杂的非标准对象,所以我猜默认的 JSON 功能相当不错。
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2014-03-10
    • 2016-05-12
    • 2011-08-02
    • 2023-03-11
    • 1970-01-01
    • 2018-05-24
    • 2013-07-07
    相关资源
    最近更新 更多