from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager from app.core.models_loader import global_models from app.routers import search, upload, view from app.core.config import settings import os @asynccontextmanager async def lifespan(app: FastAPI): # 启动时加载模型 global_models.load_models() # 创建图像数据目录 os.makedirs(settings.IMAGE_STORAGE_DIR, exist_ok=True) yield # 关闭时清理资源 pass app = FastAPI(title="Pokemon Card Search", lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 挂载静态文件 app.mount("/static", StaticFiles(directory=settings.STATIC_DIR), name="static") app.include_router(view.router) # 注册路由 app.include_router(search.router, prefix="/api/search", tags=["Search"]) app.include_router(upload.router, prefix="/api/upload", tags=["Upload"]) if __name__ == "__main__": import uvicorn uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)