Files
ai-talk-callback/main.py
2025-12-03 10:24:55 +08:00

112 lines
2.9 KiB
Python

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from app.config import settings
from app.database import init_db
from app.redis_lock import redis_manager
from app.routes import router
from app.logger import get_logger, LoggerManager
# 初始化日志系统
LoggerManager.setup_logging()
logger = get_logger("main")
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动时初始化
logger.info("🚀 应用启动中...")
try:
# 初始化数据库
logger.info("📊 初始化数据库连接...")
await init_db()
logger.info("✅ 数据库连接成功")
# 初始化Redis
logger.info("🔴 初始化Redis连接...")
await redis_manager.connect()
logger.info("✅ Redis连接成功")
logger.info(f"🎉 {settings.app_name} 启动完成!")
yield
except Exception as e:
logger.error(f"❌ 应用启动失败: {e}")
raise
finally:
# 关闭时清理
logger.info("🛑 应用关闭中...")
try:
await redis_manager.disconnect()
logger.info("✅ Redis连接已关闭")
except Exception as e:
logger.error(f"❌ Redis关闭时出错: {e}")
logger.info("👋 应用已关闭")
app = FastAPI(
title=settings.app_name,
version="1.0.0",
lifespan=lifespan,
docs_url=(
"/docs"
if not settings.disable_docs and settings.environment != "production"
else None
),
redoc_url=(
"/redoc"
if not settings.disable_docs and settings.environment != "production"
else None
),
openapi_url="/openapi.json" if not settings.disable_docs else None,
)
# 添加CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 注册路由
app.include_router(router)
@app.get("/")
async def root():
# 检查环境,生产环境下禁用根接口
if settings.environment == "production":
logger.warning("🚫 生产环境下禁止访问根接口")
from fastapi import HTTPException
raise HTTPException(status_code=404, detail="Not Found")
logger.info("📝 根接口被访问")
return {"message": f"Welcome to {settings.app_name}"}
@app.get("/health")
async def health_check():
# 检查环境,生产环境下禁用健康检查接口
if settings.environment == "production":
logger.warning("🚫 生产环境下禁止访问健康检查接口")
from fastapi import HTTPException
raise HTTPException(status_code=404, detail="Not Found")
logger.debug("💓 健康检查接口被访问")
return {"status": "healthy"}
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=settings.debug)