| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- """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
- )
|