使用FastAPI上传图片时出现Unprocessable Entity错误是什么原因?
问题产生原因
FastAPI 接口只要声明了 File/UploadFile 类型参数,就会自动使用 multipart/form-data 格式解析请求,而 form-data 原生不支持直接传递嵌套 JSON 结构。
你现有代码中 schemas.Item 类型的 request 参数被默认作为 JSON Body 字段解析,添加文件参数后解析格式切换为 form-data,框架无法从 form-data 中定位到嵌套在 request 下的 name、price 字段,因此抛出422参数缺失错误。移除文件参数时接口默认使用 application/json 格式解析,参数可以正常映射,因此运行正常。
解决方法
两种常用兼容方案:
- 方案1:拆分业务字段为独立Form参数
将Pydantic模型内的字段直接声明为Form参数,和文件参数同属form-data根层级:
from fastapi import Form @router.post('/', response_model=schemas.PostItem, status_code=status.HTTP_201_CREATED) def create( name: str = Form(...), price: float = Form(...), file: UploadFile = File(...), db: Session = Depends(get_db) ): new_item = models.Item( name=name, price=price, user_id=1, ) print(file.filename) db.add(new_item) db.commit() db.refresh(new_item) return new_item
请求时直接在form-data中添加name、price、file三个参数即可。
- 方案2:将业务模型声明为查询参数
给schemas.Item类型参数添加Depends()注解,让框架从URL查询参数中映射字段:
@router.post('/', response_model=schemas.PostItem, status_code=status.HTTP_201_CREATED) def create( request: schemas.Item = Depends(), file: UploadFile = File(...), db: Session = Depends(get_db) ): new_item = models.Item( name=request.name, price=request.price, user_id=1, ) print(file.filename) db.add(new_item) db.commit() db.refresh(new_item) return new_item
请求时将name、price放在URL查询参数中,文件放在form-data请求体中即可。
内容的提问来源于stack exchange,提问作者dianesis
相关产品推荐
相关产品推荐

