109 lines
3.0 KiB
Python
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 应用初始化完成")
|