gpt4 book ai didi

python - 使用 Pydantic 嵌套模型从 FastAPI 获取 JSON

转载 作者:行者123 更新时间:2023-12-02 02:31:42 24 4
gpt4 key购买 nike

以下代码接收一些已发布到 FastAPI 服务器的 JSON。 FastAPI 使其可以作为 Pydantic 模型在函数中使用。我的示例代码通过写入文件来处理它。我不喜欢的是(这似乎是使用 Pydantic List 的副作用),我必须循环回来才能获得一些可用的 JSON。

如何在不循环的情况下执行此操作?

我觉得这一定是可能的,因为返回图像确实有效。

from typing import List

from fastapi import FastAPI
from pydantic import BaseModel
import json

app = FastAPI()

class Image(BaseModel):
url: str
name: str

@app.post("/images/multiple/")
async def create_multiple_images(images: List[Image]):
#return images # returns json string
#print(images) # prints an Image object
#print(images.json()) # AttributeError: 'list' object has no attribute 'json'
#print(json.dumps(images)) # TypeError: Object of type Image is not JSON serializable
img_data = list() # does it really have to be this way?
for i in images:
img_data.append(i.dict())
with open('./images.json', 'w') as f:
json.dump(img_data, f, indent=2)

'''
curl -v -d '[{"name":"wilma","url":"http://this.com"},{"name":"barney","url":"http://that.com"}]' http://localhost:8000/images/multiple/
'''

该示例是从 FastAPI docs 扩展而来的

最佳答案

为了转储不带循环的模型对象列表,pydantic 提供了定义模型的功能 with a custom root type .

下面是一个小例子,展示了它的外观:

class Image(BaseModel):
url: str
name: str


class Images(BaseModel):
__root__: List[Image]


images_raw = '[{"url":"url1", "name":"name1"}, {"url":"url2", "name":"name2"}]'
images = parse_raw_as(Images, images_raw)

with open('./images.json', 'w') as f:
f.write(images.json(indent=2))

路径操作的定义如下所示:

@app.post("/images/multiple/")
async def create_multiple_images(images: Images):
with open('./images.json', 'w') as f:
f.write(images.json(indent=2))

关于python - 使用 Pydantic 嵌套模型从 FastAPI 获取 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64944900/

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