API интерфейса сессий Flask
SessionInterface — это низкоуровневая абстракция Session, позволяющая заменить стандартное хранилище Cookie в Flask на внешнее хранилище, такое как 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. По умолчанию считывает конфигурацию SESSION_COOKIE_DOMAIN |
| get_cookie_path(app) | Получить путь Cookie. По умолчанию считывает 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) | Получить время истечения сессии. Постоянная сессия возвращает now + lifetime |
| should_set_cookie(app, session) | Определить, нужно ли устанавливать Cookie. Когда сессия изменена или permanent + SESSION_REFRESH_EACH_REQUEST |
Встроенные реализации
| Класс | Описание |
|---|---|
| SecureCookieSessionInterface | Реализация по умолчанию. Использует itsdangerous Cookie для хранения данных сессии. key_derivation="hmac", digest_method=sha |
| SecureCookieSession | Класс Session, основанный на CallbackDict. Обнаруживает изменения ключей верхнего уровня и автоматически устанавливает modified=True |
| NullSession | Заполнитель Session, используемый, когда SECRET_KEY не задан. Чтение работает как обычно, изменение вызывает ошибку. |
| SessionMixin | Миксин для классов Session. Предоставляет свойства 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):
# Загрузить сессию из запроса
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):
# Сохранить сессию в ответ
if "user_id" in session:
response.headers["X-Session-ID"] = session["user_id"]
app = Flask(__name__)
# Заменить стандартную реализацию Session
app.session_interface = MySessionInterface()
from flask.sessions import SessionInterface, SessionMixin
# Пользовательский класс Session
class MySession(dict, SessionMixin):
pass
# Пользовательский интерфейс Session
class MySessionInterface(SessionInterface):
def open_session(self, app, request):
# Загрузить сессию из запроса
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):
# Сохранить сессию в ответ
if "user_id" in session:
response.headers["X-Session-ID"] = session["user_id"]
app = Flask(__name__)
# Заменить стандартную реализацию Session
app.session_interface = MySessionInterface()