现在位置: 首页 > Flask 教程 > 正文

Flask Session Interface API

SessionInterface 是 Session 的底层抽象,允许你替换 Flask 默认的 Cookie 存储方式为 Redis、数据库等外部存储。

自定义实现只需继承 SessionInterface 并实现两个方法。


SessionInterface 抽象基类

属性/方法 说明
null_session_class 当 Session 不可用时使用的类。默认为 NullSession
pickle_based bool,Session 是否基于 pickle 序列化。默认为 False
open_session(app, request) 从请求中读取 Session 数据。返回 SessionMixin 实例或 None
save_session(app, session, response) 将 Session 数据保存到响应中
make_null_session(app) 创建空 Session(当 open_session 返回 None 时自动调用)
is_null_session(obj) 判断是否为 NullSession 实例

Cookie 选项方法

以下方法用于获取 Session Cookie 的各项属性,可被重写:

方法 说明
get_cookie_name(app) 获取 Cookie 名称。默认读取 SESSION_COOKIE_NAME 配置
get_cookie_domain(app) 获取 Cookie Domain。默认读取 SESSION_COOKIE_DOMAIN 配置
get_cookie_path(app) 获取 Cookie Path。默认读取 SESSION_COOKIE_PATH 或 APPLICATION_ROOT
get_cookie_httponly(app) 获取 HttpOnly 标志。默认读取 SESSION_COOKIE_HTTPONLY
get_cookie_secure(app) 获取 Secure 标志。默认读取 SESSION_COOKIE_SECURE
get_cookie_samesite(app) 获取 SameSite 值。默认读取 SESSION_COOKIE_SAMESITE
get_cookie_partitioned(app) 获取 Partitioned 标志。默认读取 SESSION_COOKIE_PARTITIONED(v3.1+)
get_expiration_time(app, session) 获取 Session 过期时间。永久 Session 返回 now + lifetime
should_set_cookie(app, session) 判断是否需要设置 Cookie。Session 被修改或永久 + SESSION_REFRESH_EACH_REQUEST 时返回 True

内置实现

说明
SecureCookieSessionInterface 默认实现。使用 itsdangerous 签名 Cookie 存储 Session 数据。key_derivation="hmac",digest_method=sha1
SecureCookieSession 基于 CallbackDict 的 Session 类。检测顶层键的修改,自动设置 modified=True
NullSession 未设置 SECRET_KEY 时使用的占位 Session。读取正常,修改时报错
SessionMixin Session 类的 Mixin。提供 permanent、new、modified、accessed 属性

替换默认 Session 实现

实例

from flask import Flask
from flask.sessions import SessionInterface, SessionMixin

# 自定义 Session 类
class MySession(dict, SessionMixin):
    pass

# 自定义 Session 接口
class MySessionInterface(SessionInterface):
    def open_session(self, app, request):
        # 从请求中加载 Session
        user_id = request.headers.get("X-User-ID")
        if user_id:
            return MySession(user_id=user_id)
        return MySession()

    def save_session(self, app, session, response):
        # 保存 Session 到响应
        if "user_id" in session:
            response.headers["X-Session-ID"] = session["user_id"]

app = Flask(__name__)
# 替换默认的 Session 实现
app.session_interface = MySessionInterface()