import structlog import models from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from sqlmodel import SQLModel from api.agent_api import agent_router from core.config.logging_cof import setup_logging from core.db import engine from core.config.settings import settings from api.scheduler_api import scheduler_router from api.lottery_api import lottery_router from core.task.dlt_scheduler import scheduler from exceptions.handlers import register_exception_handlers from lc.chef_agent import chef_agent # 全局设置日志配置 setup_logging() logger = structlog.getLogger(__name__) # lifespan生命周期 @asynccontextmanager async def lifespan(app: FastAPI): # ========== 启动时执行 ========== logger.info("服务启动,开始创建数据表") # 同步建表 SQLModel.metadata.create_all(engine) logger.info("服务启动,启动定时调度器") # 启动定时调度器 scheduler.start() logger.info("服务启动,创建携程初始化chef_agent任务") # 异步初始化chef_agent chef_agent.initialize() logger.info("服务启动完成") try: yield # 此处交出控制权,服务开始运行 finally: # ========== 关闭时执行 ========== logger.info("服务关闭,释放资源") chef_agent.close() scheduler.shutdown() app = FastAPI(lifespan=lifespan) # 注册全局异常处理 register_exception_handlers(app) # 注册路由 app.include_router(scheduler_router) app.include_router(lottery_router) app.include_router(agent_router) # 注册中间件 app.add_middleware( CORSMiddleware, # type: ignore[arg-type] allow_origins=settings.ALLOWED_ORIGINS, allow_credentials=True, allow_methods=settings.ALLOWED_METHODS, allow_headers=settings.ALLOWED_HEADERS, ) @app.get("/") def main(): return {"message": "Hello World"} # 启动服务 --> uvicorn: Python中的轻量级web服务器 if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)