关于Flask会话的一些问题

Pau*_*gel 4 python session flask

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

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()
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

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

Mig*_*uel 8

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

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

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

  3. 在默认实现中,cookie具有将来31天设置的到期日期.可以使用PERMANENT_SESSION_LIFETIME配置设置更改此设置.

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

  • @JoranBeasley您描述的实现被广泛使用,但这不是Flask默认执行的操作.如果你使用服务器端扩展,例如[Flask-Session](http://pythonhosted.org/Flask-Session/),那么Flask会像你说的那样将会话哈希存储在cookie中. (2认同)