75 lines
2.0 KiB
Python
75 lines
2.0 KiB
Python
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) |