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:
Claude
2026-08-07 10:16:44 +08:00
co-authored by Claude
parent 64a5504396
commit 63bebedf05
99 changed files with 229 additions and 631 deletions
+23 -1
View File
@@ -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,
)
# 注册跨域中间件