# app/main.py (或你当前这个文件名) from fastapi import FastAPI from fastapi.exceptions import RequestValidationError from fastapi.staticfiles import StaticFiles # ✅ 新增:静态文件 from starlette.exceptions import HTTPException from starlette.middleware.cors import CORSMiddleware from app.api.errors.http_error import http_error_handler from app.api.errors.validation_error import http422_error_handler from app.api.routes.api import router as api_router from app.core.config import get_app_settings from app.core.events import create_start_app_handler, create_stop_app_handler def get_application() -> FastAPI: settings = get_app_settings() settings.configure_logging() application = FastAPI(**settings.fastapi_kwargs) application.add_middleware( CORSMiddleware, allow_origins=["*"], allow_origin_regex=".*", allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["*"], ) application.add_event_handler( "startup", create_start_app_handler(application, settings), ) application.add_event_handler( "shutdown", create_stop_app_handler(application), ) application.add_exception_handler(HTTPException, http_error_handler) application.add_exception_handler(RequestValidationError, http422_error_handler) # 所有业务 API 挂在 /api 前缀下(上传接口也在这里:/api/upload-image) application.include_router(api_router, prefix=settings.api_prefix) # ✅ 静态资源:让 /static/... 可直接访问(封面、正文图片等) application.mount( "/static", StaticFiles(directory="static"), name="static", ) return application app = get_application()