Flask Session Interface API
SessionInterface es la abstracción subyacente de Session, que te permite reemplazar el almacenamiento de cookies predeterminado de Flask por almacenamiento externo como Redis, bases de datos, etc.
Para una implementación personalizada solo necesitas heredarSessionInterfacee implementar dos métodos.
Clase base abstracta SessionInterface
| Atributos/Métodos | Descripción |
|---|---|
| null_session_class | Clase utilizada cuando Session no está disponible. Por defecto es NullSession |
| pickle_based | bool, indica si Session se serializa con pickle. Por defecto es False |
| open_session(app, request) | Lee los datos de Session de la solicitud. Devuelve una instancia de SessionMixin o None |
| save_session(app, session, response) | Guarda los datos de Session en la respuesta |
| make_null_session(app) | Crea una Session vacía (se llama automáticamente cuando open_session devuelve None) |
| is_null_session(obj) | Determina si es una instancia de NullSession |
Métodos de opciones de Cookie
Los siguientes métodos se utilizan para obtener los atributos de la Cookie de Session y pueden ser sobrescritos:
| Método | Descripción |
|---|---|
| get_cookie_name(app) | Obtiene el nombre de la Cookie. Por defecto lee la configuración SESSION_COOKIE_NAME |
| get_cookie_domain(app) | Obtiene el Domain de la Cookie. Por defecto lee la configuración SESSION_COOKIE_DOMAIN |
| get_cookie_path(app) | Obtiene el Path de la Cookie. Por defecto lee SESSION_COOKIE_PATH o APPLICATION_ROOT |
| get_cookie_httponly(app) | Obtiene el indicador HttpOnly. Por defecto lee SESSION_COOKIE_HTTPONLY |
| get_cookie_secure(app) | Obtiene el indicador Secure. Por defecto lee SESSION_COOKIE_SECURE |
| get_cookie_samesite(app) | Obtiene el valor SameSite. Por defecto lee SESSION_COOKIE_SAMESITE |
| get_cookie_partitioned(app) | Obtiene el indicador Partitioned. Por defecto lee SESSION_COOKIE_PARTITIONED (v3.1+) |
| get_expiration_time(app, session) | Obtiene el tiempo de expiración de Session. Para Session permanente devuelve now + lifetime |
| should_set_cookie(app, session) | Determina si es necesario configurar la Cookie. Devuelve True cuando Session ha sido modificada o es permanente + SESSION_REFRESH_EACH_REQUEST |
Implementaciones integradas
| Clase | Descripción |
|---|---|
| SecureCookieSessionInterface | Implementación predeterminada. Usa cookies firmadas con itsdangerous para almacenar los datos de Session. key_derivation="hmac", digest_method=sha1 |
| SecureCookieSession | Clase Session basada en CallbackDict. Detecta modificaciones en las claves de nivel superior y establece automáticamente modified=True |
| NullSession | Session de marcador de posición utilizada cuando no se ha configurado SECRET_KEY. La lectura es normal, pero al modificarla se produce un error |
| SessionMixin | Mixin de la clase Session. Proporciona los atributos permanent, new, modified, accessed |
Reemplazar la implementación predeterminada de Session
Ejemplo
from flask import Flask
from flask.sessions import SessionInterface, SessionMixin
# Clase Session personalizada
class MySession(dict, SessionMixin):
pass
# Interfaz Session personalizada
class MySessionInterface(SessionInterface):
def open_session(self, app, request):
# Cargar Session desde la solicitud
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):
# Guardar Session en la respuesta
if "user_id" in session:
response.headers["X-Session-ID"] = session["user_id"]
app = Flask(__name__)
# Reemplazar la implementación predeterminada de Session
app.session_interface = MySessionInterface()
from flask.sessions import SessionInterface, SessionMixin
# Clase Session personalizada
class MySession(dict, SessionMixin):
pass
# Interfaz Session personalizada
class MySessionInterface(SessionInterface):
def open_session(self, app, request):
# Cargar Session desde la solicitud
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):
# Guardar Session en la respuesta
if "user_id" in session:
response.headers["X-Session-ID"] = session["user_id"]
app = Flask(__name__)
# Reemplazar la implementación predeterminada de Session
app.session_interface = MySessionInterface()