Json-Python-Server/app/main.py

125 lines
3.6 KiB
Python
Raw Permalink Normal View History

2026-01-29 18:18:32 +08:00
"""
FastAPI 应用主入口
时间序列数据分析系统 FastAPI 版本
"""
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
from app.core.config import settings, setup_logging, ENVIRONMENT, DEBUG
from app.services.font_manager import setup_fonts_for_app
from app.services.linux_adapter import init_linux_environment
# 设置日志
logger = logging.getLogger(__name__)
# 应用生命周期
@asynccontextmanager
async def lifespan(app: FastAPI):
"""应用生命周期管理"""
# 启动时
logger.info("=" * 60)
logger.info(f"应用启动: {settings.APP_TITLE}")
logger.info(f"版本: {settings.APP_VERSION}")
logger.info(f"环境: {ENVIRONMENT}")
logger.info(f"调试: {DEBUG}")
logger.info(f"监听: {settings.HOST}:{settings.PORT}")
logger.info("=" * 60)
# 初始化 Linux 环境
try:
init_linux_environment()
except Exception as e:
logger.warning(f"Linux 环境初始化失败: {e}")
# 初始化字体
try:
fonts_config = setup_fonts_for_app(['zh', 'en'])
logger.info(f"字体配置完成: {fonts_config}")
except Exception as e:
logger.error(f"字体配置失败: {e}")
yield
# 关闭时
logger.info("应用关闭")
# 创建 FastAPI 应用
app = FastAPI(
title=settings.APP_TITLE,
description=settings.APP_DESCRIPTION,
version=settings.APP_VERSION,
lifespan=lifespan
)
# 添加中间件
# CORS 中间件
app.add_middleware(
CORSMiddleware,
allow_origins=settings.CORS_ORIGINS,
allow_credentials=settings.CORS_ALLOW_CREDENTIALS,
allow_methods=settings.CORS_ALLOW_METHODS,
allow_headers=settings.CORS_ALLOW_HEADERS,
)
# 压缩中间件
app.add_middleware(GZipMiddleware, minimum_size=1000)
# 导入和包含路由
from app.api.routes import upload, analysis, analysis_v2, files
# v2 模式:仅暴露 v2 分析接口 + 基础状态接口
if settings.API_MODE == "v2":
logger.info("API_MODE=v2: 禁用 v1 上传/文件接口,仅启用 /api/v2")
app.include_router(analysis_v2.router, prefix="/api/v2", tags=["analysis-v2"])
else:
app.include_router(upload.router, prefix="/api", tags=["upload"])
app.include_router(analysis.router, prefix="/api", tags=["analysis"])
app.include_router(analysis_v2.router, prefix="/api/v2", tags=["analysis-v2"])
app.include_router(files.router, prefix="/api", tags=["files"])
# 根路由
@app.get("/")
async def root():
"""根路径"""
return {
"message": "Lazy Stat Backend API",
"version": settings.APP_VERSION,
"docs": "/docs"
}
@app.get("/health")
async def health():
"""健康检查"""
return {
"status": "healthy",
"app": settings.APP_TITLE,
"version": settings.APP_VERSION
}
@app.get("/api/config")
async def get_config():
"""获取应用配置"""
return {
"title": settings.APP_TITLE,
"version": settings.APP_VERSION,
"max_upload_size": settings.MAX_UPLOAD_SIZE,
"allowed_extensions": list(settings.ALLOWED_EXTENSIONS),
"language_default": settings.LANGUAGE_DEFAULT
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"app.main:app",
host=settings.HOST,
port=settings.PORT,
reload=settings.RELOAD,
log_level=settings.LOG_LEVEL.lower()
)