FastAPI返回字典时报422 Unprocessable Entity错误如何解决?
问题原因
- 你在
GET接口的路径函数read_item中声明了参数Items: dict,FastAPI默认会将未指定来源(如Query/Path)的复杂类型参数判定为请求体参数,但GET请求本身不携带请求体,因此触发了「请求体字段缺失」的422错误。且该参数无实际作用,还和你定义的Pydantic模型类Items重名,导致你在返回值中尝试调用Items(items=itemslist)时,实际指向的是传入的dict参数,而非Pydantic模型类,逻辑完全错误。 - 你定义的
Items模型的items字段类型是List[Item],也就是列表类型,但你当前使用的itemslist是键值对字典,直接传给items参数不符合类型要求,后续会触发序列化错误。
解决方法
修正后的代码如下:
from typing import List, Optional from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str description: Optional[str] = None price: float tax: float = 10.5 tags: List[str] = [] class Items(BaseModel): items: List[Item] itemslist = { "foo": {"name": "Foo", "price": 50.2}, "bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2}, "baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []}, } @app.get("/items", response_model=Items, response_model_exclude_unset=True) async def read_item(): # 移除冗余参数,取字典的values转为列表传入模型 return Items(items=list(itemslist.values()))
如果你希望直接返回字典、不需要手动实例化Pydantic模型,也可以按如下写法,FastAPI会自动用你声明的response_model完成校验和序列化:
@app.get("/items", response_model=Items, response_model_exclude_unset=True) async def read_item(): return {"items": list(itemslist.values())}
内容的提问来源于stack exchange,提问作者Dylan Kraklan
相关产品推荐
相关产品推荐

