gpt4 book ai didi

python - 使用 FastAPI 读取正文 JSON 列表

转载 作者:行者123 更新时间:2023-12-03 23:27:34 26 4
gpt4 key购买 nike

HTTP PUT 请求的主体是一个 JSON 列表 - 像这样:

[item1, item2, item3, ...]

我无法改变这一点。 (如果根是一个 JSON 对象而不是一个列表,那就没有问题了。)

使用 FastAPI 我似乎无法以正常方式访问此内容:
@router.put('/data')
def set_data(data: DataModel): # This doesn't work; how do I even declare DataModel?

我找到了以下解决方法,这似乎是一个非常丑陋的黑客:
class DataModel(BaseModel):
__root__: List[str]


from fastAPI import Request

@router.put('/data')
async def set_data(request: Request): # Get the request object directly
data = DataModel(__root__=await request.json())

这肯定不是实现这一目标的“批准”方式。我已经搜索了 FastAPI 和 pydantic 的文档。我错过了什么?

最佳答案

从模型角度下降到基元

在 FastAPI 中,您从 BaseModel 派生来描述您发送和接收的数据模型(即 FastAPI 还为您从正文中解析并转换为 Python 对象)。此外,它依赖于 pydantic 的建模和处理。

from typing import List
from pydantic import BaseModel

class Item(BaseModel):
name: str

class ItemList(BaseModel):
items: List[Item]

def process_item_list(items: ItemList):
pass

这个例子将能够像解析 JSON
{"items": [{"name": "John"}, {"name": "Mary"}]}

在您的情况下 - 取决于您的列表条目的形状 - 您还需要进行适当的类型建模,但您希望直接接收和处理列表,而无需围绕它的 JSON dict 包装器。你可以去:
from typing import List
from pydantic import BaseModel

class Item(BaseModel):
name: str

def process_item_list(items: List[Item]):
pass

现在能够处理 JSON,如:
[{"name": "John"}, {"name": "Mary"}]

这可能就是您要寻找的东西,最后的调整取决于您收到的列表中物品* 的形状。如果是普通字符串,您还可以选择:
from typing import List

def process_item_list(items: List[str]):
pass

哪个可以像处理 JSON
["John", "Mary"]

我在列表中概述了从模型到基元的路径,因为我认为如果需要数据模型中的更多复杂性,我认为有必要知道这可以去哪里。

关于python - 使用 FastAPI 读取正文 JSON 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60844846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com