Flask Session API
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"))
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"))
