from contextlib import asynccontextmanager from fastapi import FastAPI from tortoise import Tortoise from redis.asyncio import Redis from app.core.exceptions import SettingNotFound from app.core.init_app import ( init_data, make_middlewares, register_exceptions, register_routers, ) try: from app.settings.config import settings except ImportError: raise SettingNotFound("Can not import settings") @asynccontextmanager async def lifespan(app: FastAPI): try: # 初始化 Redis 连接 app.state.redis_client = Redis( host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, decode_responses=True, password=settings.REDIS_PASSWORD ) # 测试 Redis 连接 await app.state.redis_client.ping() print("✅ Redis 连接成功") except Exception as e: print(f"❌ Redis 连接失败: {e}") # 执行其他初始化操作 await init_data() yield # 关闭 Redis 连接 if hasattr(app.state, 'redis_client'): await app.state.redis_client.close() print("🛑 Redis 连接关闭") # 关闭 Tortoise 连接 await Tortoise.close_connections() def create_app() -> FastAPI: app = FastAPI( title=settings.APP_TITLE, description=settings.APP_DESCRIPTION, version=settings.VERSION, openapi_url="/openapi.json", middleware=make_middlewares(), lifespan=lifespan, ) register_exceptions(app) register_routers(app, prefix="/api") return app app = create_app()