"""FastAPI 入口:挂 API + 静态前端。""" from __future__ import annotations import logging import os from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from .api import router from .config import get_settings from .db import init_db logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s") log = logging.getLogger("as-event") settings = get_settings() @asynccontextmanager async def lifespan(app: FastAPI): # 首次启动自动建表(create_all 只补缺表,安全);生产可用 ddl/own_db_init.sql if os.getenv("AUTO_CREATE_TABLES", "1") == "1": try: init_db() log.info("自有库建表检查完成") except Exception as e: # noqa: BLE001 log.warning("建表失败(DB 未就绪?):%s", e) yield app = FastAPI(title="A股大事记录 / 择时看板", version="0.1.0", lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origin_list, allow_methods=["*"], allow_headers=["*"], ) app.include_router(router) # 静态前端(放在 API 之后,作为兜底挂在根路径) _frontend = Path(__file__).resolve().parent.parent / "frontend" if _frontend.is_dir(): app.mount("/", StaticFiles(directory=str(_frontend), html=True), name="frontend") else: log.warning("未找到前端目录: %s", _frontend)