chongming/app/__init__.py
2026-01-26 09:50:55 +08:00

109 lines
3.0 KiB
Python

"""
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 应用初始化完成")