"""FastAPI主应用""" from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from ..config import get_settings, validate_config, print_config from ..database import init_db from ..rsa_service import init_rsa_keys from ..user_context import UserContextMiddleware from .routes import trip, poi, map as map_routes, auth, history, chat # 获取配置 settings = get_settings() # 创建FastAPI应用 app = FastAPI( title=settings.app_name, version=settings.app_version, description="基于HelloAgents框架的智能旅行规划助手API", docs_url="/docs", redoc_url="/redoc" ) # 配置CORS app.add_middleware( CORSMiddleware, allow_origins=settings.get_cors_origins_list(), allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册用户上下文中间件(在每个请求中解析 JWT Cookie,注入 current_user) app.add_middleware(UserContextMiddleware) # 注册路由 app.include_router(trip.router, prefix="/api") app.include_router(poi.router, prefix="/api") app.include_router(map_routes.router, prefix="/api") app.include_router(auth.router, prefix="/api") app.include_router(history.router, prefix="/api") app.include_router(chat.router, prefix="/api") @app.on_event("startup") async def startup_event(): """应用启动事件""" print("\n" + "="*60) print(f"🚀 {settings.app_name} v{settings.app_version}") print("="*60) # 打印配置信息 print_config() # 初始化数据库 try: init_db() print("✅ 数据库初始化成功") except Exception as e: print(f"⚠️ 数据库初始化失败: {e}") # 初始化RSA密钥 try: init_rsa_keys() except Exception as e: print(f"⚠️ RSA密钥初始化失败: {e}") # 验证配置 try: validate_config() print("\n✅ 配置验证通过") except ValueError as e: print(f"\n❌ 配置验证失败:\n{e}") print("\n请检查.env文件并确保所有必要的配置项都已设置") raise protocol = "https" if settings.ssl_enabled else "http" print("\n" + "="*60) print(f"📚 API文档: {protocol}://localhost:{settings.port}/docs") print(f"📖 ReDoc文档: {protocol}://localhost:{settings.port}/redoc") print("="*60 + "\n") @app.on_event("shutdown") async def shutdown_event(): """应用关闭事件""" print("\n" + "="*60) print("👋 应用正在关闭...") print("="*60 + "\n") @app.get("/") async def root(): """根路径""" return { "name": settings.app_name, "version": settings.app_version, "status": "running", "docs": "/docs", "redoc": "/redoc" } @app.get("/health") async def health(): """健康检查""" return { "status": "healthy", "service": settings.app_name, "version": settings.app_version } if __name__ == "__main__": import uvicorn ssl_kwargs = {} if settings.ssl_enabled: ssl_kwargs["ssl_certfile"] = settings.get_ssl_certfile() ssl_kwargs["ssl_keyfile"] = settings.get_ssl_keyfile() uvicorn.run( "app.api.main:app", host=settings.host, port=settings.port, reload=True, **ssl_kwargs )