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添加了并尝试发送请求,它也不会起作用,因为该操作需要请求。directionsbodyPOST
执行此操作的方法是在端点中显式定义Listwithdirections作为Query单独的参数,或者在单独的依赖项类中实现查询参数解析,如此处所述。再次记住使用 显式定义ListQuery字段,以便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\nRun 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\nRun 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)
现在您的代码应该可以完美运行。
| 归档时间: |
|
| 查看次数: |
8652 次 |
| 最近记录: |