From 817d13c8f701eae5d6819a34cb196af742343369 Mon Sep 17 00:00:00 2001 From: wuyongtao Date: Tue, 21 Jul 2026 11:06:34 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E3=80=81Docker=E9=83=A8=E7=BD=B2=E5=8F=8A?= =?UTF-8?q?=E5=89=8D=E7=AB=AFAPI=E8=AF=B7=E6=B1=82=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- backend/app/core/config.py | 23 +++++++++++++++++++++++ backend/app/main.py | 8 ++++++++ docker/app/.env.example | 1 + docker/app/docker-compose.yml | 1 + frontend/src/api/request.ts | 3 ++- 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index bf11085..926d13e 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -10,6 +10,13 @@ def _int_env(name: str, default: int) -> int: return int(raw) +def _list_env(name: str, default: list[str]) -> list[str]: + raw = os.getenv(name) + if raw is None or raw.strip() == "": + return default + return [item.strip() for item in raw.split(",") if item.strip()] + + @dataclass(frozen=True) class Settings: app_name: str = os.getenv("APP_NAME", "YG Fine-Tune Platform API") @@ -17,6 +24,7 @@ class Settings: route_prefix: str = os.getenv("MODELTF_ROUTE_PREFIX", "/modelTF") app_mode: str = os.getenv("APP_MODE", "local") database_url: str = os.getenv("DATABASE_URL", "postgresql+psycopg://yg_ft:change_me@localhost:15432/yg_ft") + cors_allow_origins: list[str] = None # type: ignore[assignment] compute_mode: str = os.getenv("COMPUTE_MODE", "real") compute_status_sync_mode: str = os.getenv("COMPUTE_STATUS_SYNC_MODE", "polling") compute_poll_interval_seconds: int = _int_env("COMPUTE_POLL_INTERVAL_SECONDS", 3) @@ -27,6 +35,21 @@ class Settings: log_max_bytes: int = _int_env("LOG_MAX_BYTES", 20 * 1024 * 1024) log_retention_days: int = _int_env("LOG_RETENTION_DAYS", 10) + def __post_init__(self) -> None: + object.__setattr__( + self, + "cors_allow_origins", + _list_env( + "CORS_ALLOW_ORIGINS", + [ + "http://localhost:16801", + "http://127.0.0.1:16801", + "http://localhost:17861", + "http://127.0.0.1:17861", + ], + ), + ) + @lru_cache def get_settings() -> Settings: diff --git a/backend/app/main.py b/backend/app/main.py index 5680303..37955e7 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,4 +1,5 @@ from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware from app.api.v1.router import api_router from app.core.config import get_settings @@ -10,6 +11,13 @@ def create_app() -> FastAPI: configure_logging(settings) app = FastAPI(title=settings.app_name) + app.add_middleware( + CORSMiddleware, + allow_origins=settings.cors_allow_origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) setup_request_logging(app) app.include_router(api_router, prefix=settings.route_prefix) return app diff --git a/docker/app/.env.example b/docker/app/.env.example index e734944..c4c81a5 100644 --- a/docker/app/.env.example +++ b/docker/app/.env.example @@ -1,6 +1,7 @@ APP_ENV=prod APP_NAME=YG Fine-Tune Platform API MODELTF_ROUTE_PREFIX=/modelTF +CORS_ALLOW_ORIGINS=http://localhost:16801,http://127.0.0.1:16801 FRONTEND_IMAGE=yg-ft-frontend-runtime:latest BACKEND_API_IMAGE=yg-ft-backend-api:latest diff --git a/docker/app/docker-compose.yml b/docker/app/docker-compose.yml index cb7307b..f380a4a 100644 --- a/docker/app/docker-compose.yml +++ b/docker/app/docker-compose.yml @@ -32,6 +32,7 @@ services: APP_ENV: ${APP_ENV:-prod} APP_NAME: ${APP_NAME:-YG Fine-Tune Platform API} MODELTF_ROUTE_PREFIX: ${MODELTF_ROUTE_PREFIX:-/modelTF} + CORS_ALLOW_ORIGINS: ${CORS_ALLOW_ORIGINS:-http://localhost:16801,http://127.0.0.1:16801} DATABASE_URL: ${DATABASE_URL:-postgresql+psycopg://yg_ft:change_me@postgres:5432/yg_ft} REDIS_URL: ${REDIS_URL:-redis://redis:6379/0} USE_BUILTIN_POSTGRES: ${USE_BUILTIN_POSTGRES:-true} diff --git a/frontend/src/api/request.ts b/frontend/src/api/request.ts index 412a4cb..9c39c92 100644 --- a/frontend/src/api/request.ts +++ b/frontend/src/api/request.ts @@ -40,7 +40,8 @@ service.interceptors.response.use( return Promise.reject(new Error(message)) }, (error) => { - const message = error.response?.data?.message || error.message || '网络异常' + const detail = error.response?.data?.detail + const message = detail?.message || error.response?.data?.message || detail || error.message || '网络异常' ElMessage.error(message) return Promise.reject(error) },