""" FastAPI 应用包 """ __version__ = "1.0.0" """ FastAPI 应用实例 """ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager import logging from app.core.config import get_settings from app.core.database import register_db, init_db, close_db from app.api import api_router # 获取配置 settings = get_settings() # 配置日志 logging.basicConfig( level=getattr(logging, settings.logging_level), format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', ) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): """ 应用生命周期管理 注意:在生产环境的模块银行中,数据库初始化可能失败 这里使用 try-except 确保应用能够正常启动 """ logger.info(f"🚀 启动 {settings.app_name} v{settings.app_version}") logger.info(f"🌍 环境: {settings.env}") # 初始化数据库(生产环境可能跳过) try: if settings.env == "development" or settings.generate_schemas: await init_db() else: logger.info("⏭️ 生产环境跳过自动数据库初始化") except Exception as e: logger.warning(f"⚠️ 数据库初始化失败: {e}") logger.warning("💡 提示:应用将继续运行,但数据库功能可能受限") yield # 关闭数据库连接 try: await close_db() except Exception as e: logger.warning(f"⚠️ 数据库关闭失败: {e}") logger.info("👋 关闭应用") # 创建 FastAPI 应用实例 app = FastAPI( title=settings.app_name, version=settings.app_version, description=settings.description, docs_url="/docs" if settings.debug else None, redoc_url="/redoc" if settings.debug else None, openapi_url="/openapi.json" if settings.debug else None, lifespan=lifespan, ) # 添加 CORS 中间件 app.add_middleware( CORSMiddleware, allow_origins=settings.cors_allow_origins, allow_credentials=settings.cors_allow_credentials, allow_methods=settings.cors_allow_methods, allow_headers=settings.cors_allow_headers, ) # 注册数据库 app = register_db(app) # 注册路由 app.include_router(api_router, prefix="/api/v1") # 根路由 @app.get("/", summary="根路径") async def root(): """根路径,返回应用信息""" return { "message": f"欢迎使用 {settings.app_name}", "version": settings.app_version, "docs": "/docs" if settings.debug else None, "health": "/api/v1/health", } # 全局异常处理器 @app.exception_handler(Exception) async def global_exception_handler(request, exc): """全局异常处理器""" logger.error(f"全局异常: {exc}") return { "error": "内部服务器错误", "detail": str(exc) if settings.debug else "请查看服务器日志" } logger.info("✅ FastAPI 应用初始化完成")