You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI Put接口含文件与Body参数时出现422错误求助

解决FastAPI PUT接口同时接收请求体参数与上传文件的422错误问题

问题原因

当接口包含UploadFile类型参数时,FastAPI会自动要求请求使用multipart/form-data编码格式。此时无法直接通过JSON格式的请求体(即BaseModel)接收参数——因为multipart/form-data下的参数是表单字段,而非JSON payload,这就是你遇到422错误的核心原因。你的POST接口能正常运行,大概率是因为TEACHER_NAME_BODY是通过Form装饰器定义的表单参数,而非普通的JSON请求体。

解决方案

方案1:直接用Form接收表单参数

如果参数不多,直接用Form逐个接收请求体参数即可,同时保留UploadFile参数:

首先导入Form:

from fastapi import Form

修改PUT接口:

@router.put('/edit_teacher', status_code=200, response_model=TeacherDisplay)
async def edit_teacher(
    teacher_id: int = Form(...),
    teacher_new_name: str | None = Form(None),
    db: DB_DEPENDENCY,
    teacher_pic: UploadFile | None = None
):
    return await teacher_functions.edit_teacher(
        teacher_id=teacher_id,
        teacher_new_name=teacher_new_name,
        db=db,
        teacher_pic=teacher_pic
    )

方案2:将BaseModel转为表单参数(适合多参数场景)

如果参数较多,不想逐个写Form,可以通过依赖函数将表单字段转为BaseModel实例:

先定义模型和依赖:

from fastapi import Form, Depends
from pydantic import BaseModel

class EditTeacherModel(BaseModel):
    teacher_id: int
    teacher_new_name: str | None = None

async def get_edit_teacher_form(
    teacher_id: int = Form(...),
    teacher_new_name: str | None = Form(None)
) -> EditTeacherModel:
    return EditTeacherModel(teacher_id=teacher_id, teacher_new_name=teacher_new_name)

然后修改接口:

@router.put('/edit_teacher', status_code=200, response_model=TeacherDisplay)
async def edit_teacher(
    request: EditTeacherModel = Depends(get_edit_teacher_form),
    db: DB_DEPENDENCY,
    teacher_pic: UploadFile | None = None
):
    return await teacher_functions.edit_teacher(
        teacher_id=request.teacher_id,
        teacher_new_name=request.teacher_new_name,
        db=db,
        teacher_pic=teacher_pic
    )

请求注意事项

发送请求时,必须以multipart/form-data格式提交:

  • 表单字段:teacher_id(必填整数)、teacher_new_name(可选字符串)
  • 文件字段:teacher_pic(可选上传文件)

内容的提问来源于stack exchange,提问作者Hossein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:42:37