feat(phase5): 解耦与收尾清理
- core/redis_client.py 移除 scheduler 耦合,lifespan 由 core/app.py 组合(Redis→调度器→Redis) - main.py 改从 core.app 导入 create_app - 删除 apps/、extensions/ 目录;utils 删除已迁移垫片与死代码 formatter.py - 新增 deploy/(nginx、supervisor)、scripts/(init_db、seed)、logs/(结构化日志落盘) - core/app.py 接入 core.logger setup_logging - 更新 CLAUDE.md 反映 core/shared/modules 新结构 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+23
-1
@@ -8,7 +8,9 @@
|
||||
|
||||
"""应用工厂:create_app 组装中间件、路由、异常处理与 lifespan。"""
|
||||
|
||||
import logging
|
||||
import time
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.exceptions import RequestValidationError
|
||||
@@ -18,6 +20,7 @@ from starlette.responses import JSONResponse
|
||||
|
||||
from config.app import FASTAPI_DEBUG
|
||||
from core.exceptions import AuthorizationException, BusinessException
|
||||
from core.logger import setup_logging
|
||||
from core.middleware import (
|
||||
register_middleware,
|
||||
register_cros,
|
||||
@@ -28,12 +31,31 @@ from core.redis_client import redis_lifespan, redis_middleware
|
||||
from routers import register_router
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def _combined_lifespan(app: FastAPI):
|
||||
"""组合 lifespan:先起 Redis,再启动定时任务调度器;退出时先停调度器再关 Redis。"""
|
||||
async with redis_lifespan(app):
|
||||
# 懒加载调度器,避免 core → 业务模块顶层依赖
|
||||
from modules.job.scheduler import init_scheduler, shutdown_scheduler
|
||||
|
||||
job_count = init_scheduler()
|
||||
logging.getLogger(__name__).info(
|
||||
f"定时任务调度器已启动,加载 {job_count} 个任务")
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
shutdown_scheduler()
|
||||
|
||||
|
||||
def create_app() -> FastAPI:
|
||||
# 初始化结构化日志(控制台 + logs/app.log)
|
||||
setup_logging()
|
||||
|
||||
app = FastAPI(
|
||||
title="FastAPI",
|
||||
description="FastAPI",
|
||||
version="v1",
|
||||
lifespan=redis_lifespan,
|
||||
lifespan=_combined_lifespan,
|
||||
)
|
||||
|
||||
# 注册跨域中间件
|
||||
|
||||
@@ -56,14 +56,7 @@ async def redis_lifespan(app: FastAPI):
|
||||
print(f"Redis 连接成功 --> {REDIS_HOST}:{REDIS_PORT}/{REDIS_INDEX}")
|
||||
logger.info(f"Redis 连接成功: {REDIS_HOST}:{REDIS_PORT}/{REDIS_INDEX}")
|
||||
|
||||
# startup: 初始化定时任务调度器
|
||||
from modules.job.scheduler import init_scheduler, shutdown_scheduler
|
||||
job_count = init_scheduler()
|
||||
logger.info(f"定时任务调度器已启动,加载 {job_count} 个任务")
|
||||
|
||||
yield
|
||||
# shutdown: 关闭调度器
|
||||
shutdown_scheduler()
|
||||
|
||||
# shutdown: 关闭连接
|
||||
await redis.aclose()
|
||||
|
||||
Reference in New Issue
Block a user