litefs.session.factory 源代码

#!/usr/bin/env python
# coding: utf-8

"""
Session 工厂

支持多种 Session 后端的工厂模式实现
"""

from typing import Optional, Union

from .session import Session, MemorySessionStore
from .db import DatabaseSession
from .redis import RedisSession
from .memcache import MemcacheSession


[文档] class SessionBackend: """Session 后端类型""" MEMORY = "memory" DATABASE = "database" REDIS = "redis" MEMCACHE = "memcache"
[文档] class SessionFactory: """ Session 工厂 根据配置创建不同类型的 Session 实例 """
[文档] @staticmethod def create_session( backend: str = SessionBackend.MEMORY, **kwargs ) -> Union[MemorySessionStore, DatabaseSession, RedisSession, MemcacheSession]: """ 创建 Session 实例 Args: backend: Session 后端类型(memory, database, redis, memcache) **kwargs: Session 配置参数 Returns: Session 实例 Raises: ValueError: 不支持的 Session 后端 ImportError: Redis 或 Memcache 包未安装 """ backend = backend.lower() if backend == SessionBackend.MEMORY: max_size = kwargs.get("max_size", 1000000) return MemorySessionStore(max_size=max_size) elif backend == SessionBackend.DATABASE: db_path = kwargs.get("db_path", ":memory:") table_name = kwargs.get("table_name", "sessions") expiration_time = kwargs.get("expiration_time", 3600) return DatabaseSession( db_path=db_path, table_name=table_name, expiration_time=expiration_time, **{k: v for k, v in kwargs.items() if k not in ["db_path", "table_name", "expiration_time", "max_size"]} ) elif backend == SessionBackend.REDIS: redis_client = kwargs.get("redis_client") host = kwargs.get("host", "localhost") port = kwargs.get("port", 6379) db = kwargs.get("db", 0) password = kwargs.get("password") key_prefix = kwargs.get("key_prefix", "litefs:session:") expiration_time = kwargs.get("expiration_time", 3600) return RedisSession( redis_client=redis_client, host=host, port=port, db=db, password=password, key_prefix=key_prefix, expiration_time=expiration_time, **{k: v for k, v in kwargs.items() if k not in ["redis_client", "host", "port", "db", "password", "key_prefix", "expiration_time", "max_size"]} ) elif backend == SessionBackend.MEMCACHE: memcache_client = kwargs.get("memcache_client") servers = kwargs.get("servers", ["localhost:11211"]) key_prefix = kwargs.get("key_prefix", "litefs:session:") expiration_time = kwargs.get("expiration_time", 3600) return MemcacheSession( memcache_client=memcache_client, servers=servers, key_prefix=key_prefix, expiration_time=expiration_time, **{k: v for k, v in kwargs.items() if k not in ["memcache_client", "servers", "key_prefix", "expiration_time", "max_size"]} ) else: raise ValueError( f"不支持的 Session 后端: {backend}。支持的类型: " f"{SessionBackend.MEMORY}, {SessionBackend.DATABASE}, " f"{SessionBackend.REDIS}, {SessionBackend.MEMCACHE}" )
[文档] @staticmethod def create_from_config(config) -> Union[MemorySessionStore, DatabaseSession, RedisSession, MemcacheSession]: """ 从配置对象创建 Session 实例 Args: config: 配置对象,应包含 session_backend 和相关配置 Returns: Session 实例 """ backend = getattr(config, "session_backend", SessionBackend.MEMORY) session_config = {} if backend == SessionBackend.REDIS: session_config = { "host": getattr(config, "redis_host", "localhost"), "port": getattr(config, "redis_port", 6379), "db": getattr(config, "redis_db", 0), "password": getattr(config, "redis_password", None), "key_prefix": getattr(config, "redis_session_key_prefix", "litefs:session:"), "expiration_time": getattr(config, "session_expiration_time", 3600), } elif backend == SessionBackend.DATABASE: session_config = { "db_path": getattr(config, "database_path", ":memory:"), "table_name": getattr(config, "database_session_table", "sessions"), "expiration_time": getattr(config, "session_expiration_time", 3600), } elif backend == SessionBackend.MEMCACHE: session_config = { "servers": getattr(config, "memcache_servers", ["localhost:11211"]), "key_prefix": getattr(config, "memcache_session_key_prefix", "litefs:session:"), "expiration_time": getattr(config, "session_expiration_time", 3600), } elif backend == SessionBackend.MEMORY: session_config = { "max_size": getattr(config, "session_max_size", 1000000), } return SessionFactory.create_session(backend, **session_config)
__all__ = [ 'SessionBackend', 'SessionFactory', ]