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]
无效的原因是什么?我究竟做错了什么?
谢谢。
目前还不可能使用GET
以 PydanticList
字段作为query
参数的请求。List
当您在 Pydantic 模型中声明一个字段时,它会被解释为请求body
参数,而不是一个请求参数query
(无论是否使用Depends()
\xe2\x80\x94,您可以通过http://127.0.0.1:8000/上的 Swagger UI 文档进行检查)例如,文档)。此外,当您使用GET
请求时,即使您在 中List
添加了并尝试发送请求,它也不会起作用,因为该操作需要请求。directions
body
POST
执行此操作的方法是在端点中显式定义List
withdirections
作为Query
单独的参数,或者在单独的依赖项类中实现查询参数解析,如此处所述。再次记住使用 显式定义List
Query
字段,以便directions
可以将其解释为查询参数并在 URL 中多次出现(换句话说,接收多个值)。例子:
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
,如下所示:
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您现在可以将 包装Query()
在 a 中Field()
,这将允许您定义一个List
将被解释为查询参数的 Pydantic 字段。请参阅此答案以获取工作示例。
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)
现在您的代码应该可以完美运行。