FastAPI - 带有 Pydantic 列表字段的 GET 请求

Avi*_*021 9 python pydantic fastapi

GET我是 FastAPI 的新手(从 Flask 迁移),我正在尝试为我的路线创建一个 Pydantic 模型:

from fastapi import APIRouter,Depends
from pydantic import BaseModel
from typing import Optional,List

router = APIRouter()

class SortModel(BaseModel):
    field:    Optional[str]
    directions: List[str]

@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel)):
    pass #my code for handling this route.....
Run Code Online (Sandbox Code Playgroud)

当我跑步时 curl -X GET http://localhost:XXXX/pydanticmodel?directions=up&directions=asc&field=id 我得到422 Unprocessable Entity: {"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}

但如果我正在改变directions:List[str]->directions: str我正在200 OK接受directions="asc". str对于查询参数有效而List[str]无效的原因是什么?我究竟做错了什么?

谢谢。

Chr*_*ris 5

目前还不可能使用GET以 PydanticList字段作为query参数的请求。List当您在 Pydantic 模型中声明一个字段时,它会被解释为请求body参数,而不是一个请求参数query(无论是否使用Depends()\xe2\x80\x94,您可以通过http://127.0.0.1:8000/上的 Swagger UI 文档进行检查)例如,文档)此外,当您使用GET请求时,即使您在 中List添加了并尝试发送请求,它也不会起作用,因为该操作需要请求。directionsbodyPOST

\n

执行此操作的方法是在端点中显式定义Listwithdirections作为Query单独的参数,或者在单独的依赖项类中实现查询参数解析,如此处所述。再次记住使用 显式定义ListQuery字段,以便directions可以将其解释为查询参数并在 URL 中多次出现(换句话说,接收多个值)。例子:

\n
from typing import List, Optional\nfrom fastapi import APIRouter, Depends, Query\n\nclass SortModel:\n    def __init__(\n        self,\n        field:  Optional[str],\n        directions: List[str] = Query(...)\n    ):\n        self.field = field\n        self.directions = directions\n\nrouter = APIRouter()\n\n@router.get("/")\ndef send_user(criteria: SortModel = Depends()):\n    return criteria\n
Run Code Online (Sandbox Code Playgroud)\n

可以使用装饰器重写上面的内容@dataclass,如下所示:

\n
from typing import List, Optional\nfrom fastapi import APIRouter, Depends, Query\nfrom dataclasses import dataclass\n\n@dataclass\nclass SortModel:\n    field:    Optional[str]\n    directions: List[str] = Query(...)\n\nrouter = APIRouter()\n\n@router.get("/")\ndef send_user(criteria: SortModel = Depends()):\n    return criteria\n
Run Code Online (Sandbox Code Playgroud)\n

更新

\n

您现在可以将 包装Query()在 a 中Field(),这将允许您定义一个List将被解释为查询参数的 Pydantic 字段。请参阅此答案以获取工作示例。

\n


Yag*_*nci -1

这不是 Pydantic 或 FastAPI 问题。

如果你想用curl发送一个数组,你应该使用-d标志。

In: curl -X GET "http://127.0.0.1:8000/pydanticmodel?field=123"  -d "[\"string\"]"
Out: {"field":"123","directions":["string"]}
Run Code Online (Sandbox Code Playgroud)

现在您的代码应该可以完美运行。