- Fix SQL injection risks in proxy_repo and task_repo - Atomic acquire_pending with UPDATE ... RETURNING - Reuse aiohttp ClientSession in ValidatorService - Replace polling with asyncio.Event in SchedulerService - Optimize ValidationQueue.drain with asyncio.Condition - Concurrent plugin crawling with asyncio.gather - Unify ProxyRaw model import path - Fix test baseline and remove tracked __pycache__ files
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""应用生命周期管理"""
|
|
from contextlib import asynccontextmanager
|
|
from fastapi import FastAPI
|
|
from app.core.db import init_db, get_db
|
|
from app.core.config import settings as app_settings
|
|
from app.core.log import logger
|
|
from app.api.deps import create_scheduler_service
|
|
from app.repositories.settings_repo import SettingsRepository
|
|
|
|
settings_repo = SettingsRepository()
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
"""应用启动和关闭时的生命周期管理"""
|
|
# 初始化数据库
|
|
await init_db()
|
|
|
|
# 创建调度器并挂载到 app.state
|
|
scheduler_service = create_scheduler_service()
|
|
app.state.scheduler_service = scheduler_service
|
|
app.state.validation_queue = scheduler_service.validation_queue
|
|
|
|
# 加载设置并决定是否启动调度器
|
|
try:
|
|
async with get_db() as db:
|
|
settings = await settings_repo.get_all(db)
|
|
scheduler_service.interval_minutes = settings.get(
|
|
"validate_interval_minutes", app_settings.validator_timeout
|
|
)
|
|
if settings.get("auto_validate", True):
|
|
await scheduler_service.start()
|
|
except Exception as e:
|
|
logger.error(f"Failed to load settings on startup: {e}")
|
|
|
|
logger.info("API server started")
|
|
yield
|
|
|
|
# 关闭调度器
|
|
await scheduler_service.stop()
|
|
await scheduler_service.validation_queue.validator.close()
|
|
logger.info("API server shutdown")
|