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
相关产品推荐
相关产品推荐

