main.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """FastAPI主应用"""
  2. from fastapi import FastAPI
  3. from fastapi.middleware.cors import CORSMiddleware
  4. from ..config import get_settings, validate_config, print_config
  5. from ..database import init_db
  6. from ..rsa_service import init_rsa_keys
  7. from ..user_context import UserContextMiddleware
  8. from .routes import trip, poi, map as map_routes, auth, history, chat
  9. # 获取配置
  10. settings = get_settings()
  11. # 创建FastAPI应用
  12. app = FastAPI(
  13. title=settings.app_name,
  14. version=settings.app_version,
  15. description="基于HelloAgents框架的智能旅行规划助手API",
  16. docs_url="/docs",
  17. redoc_url="/redoc"
  18. )
  19. # 配置CORS
  20. app.add_middleware(
  21. CORSMiddleware,
  22. allow_origins=settings.get_cors_origins_list(),
  23. allow_credentials=True,
  24. allow_methods=["*"],
  25. allow_headers=["*"],
  26. )
  27. # 注册用户上下文中间件(在每个请求中解析 JWT Cookie,注入 current_user)
  28. app.add_middleware(UserContextMiddleware)
  29. # 注册路由
  30. app.include_router(trip.router, prefix="/api")
  31. app.include_router(poi.router, prefix="/api")
  32. app.include_router(map_routes.router, prefix="/api")
  33. app.include_router(auth.router, prefix="/api")
  34. app.include_router(history.router, prefix="/api")
  35. app.include_router(chat.router, prefix="/api")
  36. @app.on_event("startup")
  37. async def startup_event():
  38. """应用启动事件"""
  39. print("\n" + "="*60)
  40. print(f"🚀 {settings.app_name} v{settings.app_version}")
  41. print("="*60)
  42. # 打印配置信息
  43. print_config()
  44. # 初始化数据库
  45. try:
  46. init_db()
  47. print("✅ 数据库初始化成功")
  48. except Exception as e:
  49. print(f"⚠️ 数据库初始化失败: {e}")
  50. # 初始化RSA密钥
  51. try:
  52. init_rsa_keys()
  53. except Exception as e:
  54. print(f"⚠️ RSA密钥初始化失败: {e}")
  55. # 验证配置
  56. try:
  57. validate_config()
  58. print("\n✅ 配置验证通过")
  59. except ValueError as e:
  60. print(f"\n❌ 配置验证失败:\n{e}")
  61. print("\n请检查.env文件并确保所有必要的配置项都已设置")
  62. raise
  63. protocol = "https" if settings.ssl_enabled else "http"
  64. print("\n" + "="*60)
  65. print(f"📚 API文档: {protocol}://localhost:{settings.port}/docs")
  66. print(f"📖 ReDoc文档: {protocol}://localhost:{settings.port}/redoc")
  67. print("="*60 + "\n")
  68. @app.on_event("shutdown")
  69. async def shutdown_event():
  70. """应用关闭事件"""
  71. print("\n" + "="*60)
  72. print("👋 应用正在关闭...")
  73. print("="*60 + "\n")
  74. @app.get("/")
  75. async def root():
  76. """根路径"""
  77. return {
  78. "name": settings.app_name,
  79. "version": settings.app_version,
  80. "status": "running",
  81. "docs": "/docs",
  82. "redoc": "/redoc"
  83. }
  84. @app.get("/health")
  85. async def health():
  86. """健康检查"""
  87. return {
  88. "status": "healthy",
  89. "service": settings.app_name,
  90. "version": settings.app_version
  91. }
  92. if __name__ == "__main__":
  93. import uvicorn
  94. ssl_kwargs = {}
  95. if settings.ssl_enabled:
  96. ssl_kwargs["ssl_certfile"] = settings.get_ssl_certfile()
  97. ssl_kwargs["ssl_keyfile"] = settings.get_ssl_keyfile()
  98. uvicorn.run(
  99. "app.api.main:app",
  100. host=settings.host,
  101. port=settings.port,
  102. reload=True,
  103. **ssl_kwargs
  104. )