如何在FastAPI中同时请求FormData与图片?附报错及代码
解决FastAPI同时接收表单数据与图片的接口错误
问题原因
当接口同时包含UploadFile(文件)和Pydantic模型参数时,FastAPI会将请求内容类型设为multipart/form-data,但Pydantic模型默认仅支持解析JSON格式数据,无法直接从表单字段中解析,因此会触发422验证错误。
解决方案
需要将Pydantic模型的字段通过Form依赖项接收,再转换为模型实例。以下是两种可行的修改方式:
方式1:逐个字段用Form接收并组装模型
from fastapi import FastAPI, File, UploadFile, Form from pydantic import BaseModel app = FastAPI() class UserModel(BaseModel): username: str password: str firstname: str lastname: str @app.post('/register') async def register_kamwali( username: str = Form(...), password: str = Form(...), firstname: str = Form(...), lastname: str = Form(...), image: UploadFile = File(...) ): print(image.filename) user = UserModel(username=username, password=password, firstname=firstname, lastname=lastname) data = {"password": user.password, "firstname": user.firstname, "lastname": user.lastname} db.child("Users").child(user.username).set(data); db.push(data) return {"user added successfully !!"}
方式2:自定义依赖函数转换表单字段为模型
from fastapi import FastAPI, File, UploadFile, Form, Depends from pydantic import BaseModel app = FastAPI() class UserModel(BaseModel): username: str password: str firstname: str lastname: str async def get_user_from_form( username: str = Form(...), password: str = Form(...), firstname: str = Form(...), lastname: str = Form(...) ) -> UserModel: return UserModel(username=username, password=password, firstname=firstname, lastname=lastname) @app.post('/register') async def register_kamwali( user: UserModel = Depends(get_user_from_form), image: UploadFile = File(...) ): print(image.filename) data = {"password": user.password, "firstname": user.firstname, "lastname": user.lastname} db.child("Users").child(user.username).set(data); db.push(data) return {"user added successfully !!"}
说明
两种方式的核心逻辑一致:通过Form依赖项获取表单字段,再转换为UserModel实例,让FastAPI能正确解析multipart/form-data类型请求,同时处理文件与表单数据。
内容的提问来源于stack exchange,提问作者Abhay Chaudhari
相关产品推荐
相关产品推荐

