Files
ozon-seller-kit/server/main.py
T
R524809 dc6d38c128 refactor(server): 移除鉴权并归档遗留路由至 legacy/
- 删除 auth.py 与 deps.py,各路由去除 get_current_user 依赖
- collection.py 更名为 materials.py,冻结链路(ozon/publish/shops/categories)移入 legacy/
- 扩展默认生图服务端口并入 8800 并自动迁移旧配置,水印默认文案改为 Panda Store
- 新增 docs/v2.1/backend-structure.md 后端结构盘点文档
2026-08-28 15:09:22 +08:00

77 lines
2.4 KiB
Python

from pathlib import Path
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from sqlalchemy import text
from api import ai, export, fx, image, materials, products, proxy, suite
from config import get_settings
from db import get_engine
# web/ 是 v1 工具台,留在仓库根,故上跳一级
WEB_DIR = Path(__file__).resolve().parents[1] / "web"
# 本地存储(开发兜底)媒体目录
MEDIA_DIR = Path(__file__).resolve().parents[1] / "data" / "media"
app = FastAPI(title="Ozon Seller Kit", version="0.2.0")
settings = get_settings()
if settings.cors_origin_list:
app.add_middleware(
CORSMiddleware,
allow_origins=settings.cors_origin_list,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 业务路由(活跃:采集上报 / 商品库 / 套图生图 / 辅助)
app.include_router(materials.router)
app.include_router(products.router)
app.include_router(fx.router)
app.include_router(ai.router)
app.include_router(image.router)
# V2.1 套图生图(试算页 04 区块)/ 导出 / 图片代理
app.include_router(suite.router)
app.include_router(export.router)
app.include_router(proxy.router)
# ⚠️ 冻结链路(Ozon API 直传):代码移至 legacy/,接口保留但不再投入
from legacy.api import categories, ozon, publish, shops # noqa: E402
app.include_router(shops.router)
app.include_router(categories.router)
app.include_router(publish.router)
app.include_router(ozon.router)
@app.on_event("startup")
async def on_startup() -> None:
# 开发便利:确保表存在(生产以 Alembic 迁移为准,create_all 幂等不删表)
from db import Base
import models # noqa: F401
MEDIA_DIR.mkdir(parents=True, exist_ok=True)
async with get_engine().begin() as conn:
await conn.run_sync(Base.metadata.create_all)
@app.get("/api/health")
async def health() -> dict:
db_ok = True
try:
async with get_engine().connect() as conn:
await conn.execute(text("SELECT 1"))
except Exception: # noqa: BLE001
db_ok = False
return {"status": "ok" if db_ok else "degraded", "db": db_ok}
# 本地媒体(开发兜底存储)
MEDIA_DIR.mkdir(parents=True, exist_ok=True)
app.mount("/media", StaticFiles(directory=str(MEDIA_DIR)), name="media")
if WEB_DIR.is_dir():
app.mount("/", StaticFiles(directory=str(WEB_DIR), html=True), name="web")