56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
import logging
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
|
|
from app.api.router import api_router
|
|
from app.core.config import settings
|
|
from app.services.pdf_cleanup import cleanup_expired_pdfs
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
"""应用生命周期管理"""
|
|
# 启动时执行
|
|
logger.info("[应用启动] 初始化定时任务...")
|
|
|
|
# 启动后台清理任务
|
|
import asyncio
|
|
async def cleanup_task():
|
|
while True:
|
|
try:
|
|
# 每天执行一次PDF清理
|
|
await asyncio.sleep(24 * 60 * 60) # 24小时
|
|
logger.info("[定时任务] 开始执行PDF清理...")
|
|
cleanup_expired_pdfs()
|
|
except Exception as e:
|
|
logger.error(f"[定时任务] PDF清理失败: {str(e)}")
|
|
|
|
# 启动后台任务
|
|
asyncio.create_task(cleanup_task())
|
|
logger.info("[应用启动] 定时任务已启动")
|
|
|
|
yield
|
|
|
|
# 关闭时执行
|
|
logger.info("[应用关闭] 清理资源...")
|
|
|
|
|
|
def create_app() -> FastAPI:
|
|
app = FastAPI(title=settings.app_name, lifespan=lifespan)
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=settings.cors_origins,
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
app.include_router(api_router)
|
|
return app
|
|
|
|
|
|
app = create_app()
|