customs-data / apps /api /main.py
3v324v23's picture
Deploy to Hugging Face Spaces - SQLite version with 10k sample data
0e8f624
Raw
History Blame Contribute Delete
1.84 kB
from contextlib import asynccontextmanager
from pathlib import Path
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
from packages.core.logger import app_logger
# 我们将之前写好的 trade 接口引入
from apps.api.routers import trade, entity, export, subscription, bi, health
# 获取项目根目录
BASE_DIR = Path(__file__).resolve().parent.parent.parent
STATIC_DIR = BASE_DIR / "apps" / "api" / "static"
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动时初始化
app_logger.info("Initializing API Service...")
yield
# 关闭时
app_logger.info("Closing API Service...")
app = FastAPI(
title="Customs Data API",
description="海关数据查询服务 API",
version="1.0.0",
lifespan=lifespan
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 挂载静态文件
app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")
@app.get("/", tags=["UI"])
async def serve_ui():
return FileResponse(str(STATIC_DIR / "index.html"))
@app.get("/api/v1/health", tags=["System"])
async def health_check():
return {"status": "ok", "service": "Customs Data API"}
app.include_router(health.router, prefix="/api/v1/health", tags=["Health"])
app.include_router(trade.router, prefix="/api/v1/trade", tags=["Trade Search"])
app.include_router(entity.router, prefix="/api/v1/entity", tags=["Entity Search"])
app.include_router(export.router, prefix="/api/v1/export", tags=["Export"])
app.include_router(subscription.router, prefix="/api/v1/subscription", tags=["Subscription"])
app.include_router(bi.router, prefix="/api/v1/bi", tags=["BI Dashboard"])