fix: 禁用 redirect_slashes 修复 307 重定向导致前端新建失败

- FastAPI 初始化添加 redirect_slashes=False,避免反向代理后
  307 重定向 URL 丢失 HTTPS 协议
- 移除 titles.py/voices.py/generation_tasks.py 路由中的尾斜杠
  ('/' → '','/tasks/' → '/tasks','/tasks/{id}/results/' → '/tasks/{id}/results')

Fixes: 前端调用 POST /api/v1/titles 等接口时 307 重定向到 http:// 导致失败
This commit is contained in:
API文档维护Agent
2026-06-28 18:54:27 +08:00
parent 60afbf450d
commit 97b436d016
4 changed files with 7 additions and 6 deletions
+2 -2
View File
@@ -79,7 +79,7 @@ def _ensure_library_has_ready_video_assets(assets) -> None:
)
@router.post("/tasks/", response_model=GenerationTaskResponse)
@router.post("/tasks", response_model=GenerationTaskResponse)
def create_generation_task(
request: CreateGenerationTaskRequest,
authenticated_user: AuthenticatedUser = Depends(get_current_user),
@@ -130,7 +130,7 @@ def get_generation_task(
return _to_generation_task_response(task)
@router.get("/tasks/{task_id}/results/", response_model=ListGeneratedVideosResponse)
@router.get("/tasks/{task_id}/results", response_model=ListGeneratedVideosResponse)
def list_generation_results(
task_id: str,
authenticated_user: AuthenticatedUser = Depends(get_current_user),
+2 -2
View File
@@ -57,7 +57,7 @@ def _get_user_plan(user_id: str, user_repository: UserRepository) -> str:
return getattr(user, "subscription_plan", "free") or "free"
@router.get("/", response_model=ListTitleLibraryResponse)
@router.get("", response_model=ListTitleLibraryResponse)
def list_titles(
category: Optional[str] = Query(None),
skip: int = Query(0, ge=0),
@@ -89,7 +89,7 @@ def get_title(
return _to_response(item)
@router.post("/", response_model=TitleLibraryItemResponse, status_code=status.HTTP_201_CREATED)
@router.post("", response_model=TitleLibraryItemResponse, status_code=status.HTTP_201_CREATED)
def create_title(
request: CreateTitleLibraryRequest,
authenticated_user: AuthenticatedUser = Depends(get_current_user),
+2 -2
View File
@@ -61,7 +61,7 @@ def _get_user_plan(user_id: str, user_repository: UserRepository) -> str:
return getattr(user, "subscription_plan", "free") or "free"
@router.get("/", response_model=ListVoiceLibraryResponse)
@router.get("", response_model=ListVoiceLibraryResponse)
def list_voices(
status_filter: Optional[str] = Query(None, alias="status"),
skip: int = Query(0, ge=0),
@@ -93,7 +93,7 @@ def get_voice(
return _to_response(item)
@router.post("/", response_model=VoiceLibraryItemResponse, status_code=status.HTTP_201_CREATED)
@router.post("", response_model=VoiceLibraryItemResponse, status_code=status.HTTP_201_CREATED)
def create_voice(
request: CreateVoiceLibraryRequest,
authenticated_user: AuthenticatedUser = Depends(get_current_user),
+1
View File
@@ -24,6 +24,7 @@ app = FastAPI(
version=settings.APP_VERSION,
docs_url="/docs",
redoc_url="/redoc",
redirect_slashes=False,
)
app.add_exception_handler(APIException, api_exception_handler)