"""FastAPI 入口。 通过 `uvicorn app.main:app --reload` 启动。 """ from __future__ import annotations import logging from collections.abc import AsyncIterator from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.api.v1.auth import router as auth_router from app.core.config import settings from app.core.logging import setup_logging setup_logging(debug=settings.APP_DEBUG) logger = logging.getLogger("shagua.main") @asynccontextmanager async def lifespan(_: FastAPI) -> AsyncIterator[None]: # 提示而非强制建表:生产用 alembic upgrade head,本地 dev 也建议先跑一次 migration。 # 这里只 log,不自动 create_all,避免生产环境意外建出过时 schema。 logger.info( "started env=%s debug=%s db=%s", settings.APP_ENV, settings.APP_DEBUG, settings.DATABASE_URL.split("://", 1)[0], ) yield logger.info("shutting down") app = FastAPI( title=settings.APP_NAME, version="0.1.0", docs_url="/docs" if not settings.is_prod else None, redoc_url="/redoc" if not settings.is_prod else None, lifespan=lifespan, ) if settings.cors_origins_list: app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origins_list, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/health", tags=["meta"]) def health() -> dict[str, str]: return {"status": "ok"} app.include_router(auth_router)