使用 FastAPI 读取正文 JSON 列表
Read a body JSON list with FastAPI
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?
我发现了以下变通方法,这似乎是一个非常丑陋的 hack:
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())
这肯定不是实现此目标的 'approved' 方法。我已经搜索了 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"}]
这可能是您正在寻找的,最后一次调整取决于您收到的列表中的 item* 的形状。如果是纯字符串,你也可以选择:
from typing import List
def process_item_list(items: List[str]):
pass
哪个可以像
一样处理JSON
["John", "Mary"]
我在列表中概述了从模型到基元的路径,因为我认为如果需要更复杂的数据模型,那么了解它的去向是值得的。
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?
我发现了以下变通方法,这似乎是一个非常丑陋的 hack:
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())
这肯定不是实现此目标的 'approved' 方法。我已经搜索了 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"}]
这可能是您正在寻找的,最后一次调整取决于您收到的列表中的 item* 的形状。如果是纯字符串,你也可以选择:
from typing import List
def process_item_list(items: List[str]):
pass
哪个可以像
一样处理JSON["John", "Mary"]
我在列表中概述了从模型到基元的路径,因为我认为如果需要更复杂的数据模型,那么了解它的去向是值得的。