教程 / Python3 / Flask Session API

Flask Session API

Flask Session API Session 用于在同一用户的不同请求之间保存数据。Flask 默认使用签名 Cookie 实现,数据存储在客户端但无法被篡改。 通过 from flask import sessi

Session 用于在同一用户的不同请求之间保存数据。Flask 默认使用签名 Cookie 实现,数据存储在客户端但无法被篡改。

通过 from flask import session 导入,像字典一样使用。


session 代理对象

session 是一个代理,指向当前请求的 SessionMixin 实例。只在请求上下文中可用。

属性/方法 说明
session[key] = value 设置 session 值
session.get(key, default) 安全获取 session 值,键不存在时返回 default
session.pop(key, default) 移除并返回指定键的值
session.clear() 清空所有 session 数据
"key" in session 检查键是否存在
session.permanent 设为 True 时,Session 在浏览器关闭后仍保持(使用 PERMANENT_SESSION_LIFETIME)
session.modified 当修改 session 中的可变值时(如列表 append),需手动设为 True
session.accessed session 被访问时为 True,Flask 会自动添加 Vary: Cookie 头
session.new session 是否为新创建(部分实现不支持精确判断)

当修改 session 中嵌套的可变对象(如列表、字典)时,Flask 无法自动检测到修改。

必须手动设置 session.modified = True,否则修改不会保存到 Cookie 中。


配置项

配置键 默认值 说明
SECRET_KEY None 签名 Session 的密钥,必须设置才能使用 Session
SESSION_COOKIE_NAME "session" Session Cookie 的名称
SESSION_COOKIE_DOMAIN None Cookie 的 Domain 属性
SESSION_COOKIE_PATH None Cookie 的 Path 属性
SESSION_COOKIE_HTTPONLY True 禁止 JavaScript 访问 Session Cookie
SESSION_COOKIE_SECURE False 为 True 时仅通过 HTTPS 发送 Cookie
SESSION_COOKIE_SAMESITE None "Strict"、"Lax" 或 None
PERMANENT_SESSION_LIFETIME timedelta(days=31) 永久 Session 的有效期
SESSION_REFRESH_EACH_REQUEST True 每次请求都刷新 Session Cookie 的有效期

代码示例

实例

from flask import Flask, session, redirect, url_for

app = Flask(__name__)
app.secret_key = "your-secret-key"

@app.route("/")
def index():
    if "username" in session:
        return f'Logged in as {session["username"]}'
    return 'You are not logged in'

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        session["username"] = request.form["username"]
        # 设置永久 session(浏览器关闭后保持 31 天)
        session.permanent = True
        return redirect(url_for("index"))
    return '<form method="post"><input name="username"></form>'

@app.route("/appends")
def append_to_list():
    # 注意:修改嵌套列表需要手动标记 modified
    if "items" not in session:
        session["items"] = []
    session["items"].append("new_item")
    session.modified = True  # 必须手动标记!
    return f'Items: {session["items"]}'

@app.route("/logout")
def logout():
    session.clear()
    return redirect(url_for("index"))