如何使用 pydantic/fastapi 接受具有数组\单个项目的单个路由对象?

Posted

技术标签:

【中文标题】如何使用 pydantic/fastapi 接受具有数组\\单个项目的单个路由对象?【英文标题】:How do I accept on a single route objects with array\single items using pydantic/fastapi?如何使用 pydantic/fastapi 接受具有数组\单个项目的单个路由对象? 【发布时间】:2021-08-26 16:26:51 【问题描述】:

说我有:

from pydantic import BaseModel
from typing import Optional, List

class Create(BaseModel):
    code: List[str] = []
    args: List[str] = []

包装成类似的东西

@router.post('/new', status_code=201)
async def create_project(data: Create):
    pass

所以code 和/或args 是请求者的数组或单个值?

这样对单一路由的请求可能包含以下任何内容:

code: "code", args: "arg"
code: ["code"], args: "arg"
code: ["code"], args: ["arg"]
code: "code", args: ["arg"]

并且总是调用具有使用列表的真实类型的处理程序?

【问题讨论】:

【参考方案1】:

Pydantic 模型接受 Union 作为字段定义,例如:

from typing import List, Union

class Create(BaseModel):
    code: Union[str, List[str]] = []
    args: Union[str, List[str]] = []

在这种情况下,codeargs 都将接受 strstrs 的列表/数组。

codeargs 都将默认为空的 list

其余代码保持不变,例如:

from fastapi import FastAPI, status

app = FastAPI()

@app.post("/create", status_code=status.HTTP_201_CREATED)
async def create_project(data: Create):
    return data

单项调用端点:

$ curl -i -X 'POST' 'http://127.0.0.1:8000/create' \
    -H 'accept: application/json' \
    -H 'Content-Type: application/json' \
    -d '"code": "code", "args": "arg"'

HTTP/1.1 201 Created
date: Sun, 29 Aug 2021 10:25:57 GMT
server: uvicorn
content-length: 28
content-type: application/json

"code":"code","args":"arg"

使用多个项目调用端点:

$ curl -i -X 'POST' 'http://127.0.0.1:8000/create' \
    -H 'accept: application/json' \
    -H 'Content-Type: application/json' \
    -d '"code": ["code"], "args": ["arg"]'

HTTP/1.1 201 Created
date: Sun, 29 Aug 2021 10:27:03 GMT
server: uvicorn
content-length: 32
content-type: application/json

"code":["code"],"args":["arg"]

【讨论】:

【参考方案2】:

您有很多可能性,其中一种通用方法是使用validator(或根验证器),并将单个值解析为列表。像这样:

class Create(BaseModel):
    code: List[str] = []

    @validator('code', pre=True)
    def code_validate(cls, values):
        if not isinstance(values, list):
            values = [values]
        return values

【讨论】:

遗憾的是,即使在使用 allow_reuse=True 应用此功能后,我仍从 fastapi 获得 422 Unprocessable Entity 在这种情况下,需要最小的可重现示例

以上是关于如何使用 pydantic/fastapi 接受具有数组\单个项目的单个路由对象?的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch如何实现多层全连接神经网络

如何去除 sklearn 线性 SVM 中 10% 最具预测性的特征

如何推进DevOps转型

PyTorch如何实现多层全连接神经网络

如何在应用中搜索用户? (最具成本效益的方式)在 Firebase

如何学习摸具设计?怎样学习摸具设计?学习摸具设计的方法。