api.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. """FastAPI 静态服务:托管单页前端 + 媒体/抽帧落盘目录。
  2. 启动:
  3. CK_ENV_FILE=/path/.env uvicorn creation_knowledge.api:app --host 0.0.0.0 --port 8123
  4. 前端单页在 /,媒体在 /data,视频帧在 /frames。
  5. """
  6. from __future__ import annotations
  7. import os
  8. from functools import lru_cache
  9. from pathlib import Path
  10. from fastapi import FastAPI
  11. from fastapi.middleware.cors import CORSMiddleware
  12. from fastapi.responses import RedirectResponse
  13. from fastapi.staticfiles import StaticFiles
  14. from core.config import Settings
  15. _ROOT = Path(__file__).resolve().parent.parent
  16. WEB_DIR = _ROOT / "acquisition" / "web" # 前端工程目录(仅 app/ 下的 Vite 产物)
  17. def _env_file() -> str:
  18. return os.getenv("CK_ENV_FILE", ".env")
  19. @lru_cache(maxsize=1)
  20. def _settings() -> Settings:
  21. return Settings.from_env(_env_file())
  22. app = FastAPI(title="创作知识")
  23. app.add_middleware(
  24. CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]
  25. )
  26. # 视频帧静态服务(card.url = /frames/<post_id>/<file>)
  27. _frames_dir = Path(_settings().frames_dir)
  28. _frames_dir.mkdir(parents=True, exist_ok=True)
  29. app.mount("/frames", StaticFiles(directory=str(_frames_dir)), name="frames")
  30. # 媒体静态服务(card.url = /data/<run_id>/<platform>/<post_id>/<file>)
  31. _data_dir = Path(_settings().data_dir or "data")
  32. _data_dir.mkdir(parents=True, exist_ok=True)
  33. app.mount("/data", StaticFiles(directory=str(_data_dir)), name="data")
  34. # 取数接口(分页/筛选)
  35. from acquisition.web_api import router as api_router # noqa: E402
  36. app.include_router(api_router)
  37. # 根路径直接送到前端
  38. @app.get("/")
  39. def _root() -> RedirectResponse:
  40. return RedirectResponse(url="/app/")
  41. # 唯一前端:Vite+React 构建产物挂在 /app(旧静态看板已下线)
  42. _APP_DIST = WEB_DIR / "app" / "dist"
  43. if _APP_DIST.exists():
  44. app.mount("/app", StaticFiles(directory=str(_APP_DIST), html=True), name="app")