from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.staticfiles import StaticFiles import os from tortoise import Tortoise from app.core.exceptions import SettingNotFound from app.core.init_app import ( init_data, make_middlewares, register_exceptions, register_routers, ) from app.core.clickhouse import clickhouse_manager from app.core.scheduler import start_scheduler, shutdown_scheduler try: from app.settings.config import settings except ImportError: raise SettingNotFound("Can not import settings") @asynccontextmanager async def lifespan(app: FastAPI): await Tortoise.init(config=settings.TORTOISE_ORM) await Tortoise.generate_schemas() await init_data() start_scheduler() yield # 清理所有数据库连接 await Tortoise.close_connections() await clickhouse_manager.close() shutdown_scheduler() def create_app() -> FastAPI: app = FastAPI( title=settings.APP_TITLE, description=settings.APP_DESCRIPTION, version=settings.VERSION, openapi_url="/openapi.json", middleware=make_middlewares(), lifespan=lifespan, ) register_exceptions(app) register_routers(app, prefix="/api") # Mount static files static_dir = os.path.join(settings.BASE_DIR, "static") if os.path.exists(static_dir): app.mount("/static", StaticFiles(directory=static_dir), name="static") return app app = create_app()