FastAPI - запрос GET с полем Pydantic List

Я новичок в FastAPI (переход с Flask), и я пытаюсь создать Pydantic Model для моего маршрута GET

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.....

Когда я бегу 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 с direction = asc. По какой причине str работает с параметром запроса, а List[str] - нет? Что я делаю неправильно?

Спасибо.


person Avish021    schedule 14.09.2020    source источник


Ответы (2)


Я столкнулся с той же проблемой. Следующее решение будет работать, но это не совсем то, что я хочу, но, возможно, оно вам подходит:

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

router = APIRouter()

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

@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel), directions: List[str] = Query(...)):
    pass #my code for handling this route.....
person Jon E    schedule 29.04.2021

Это не проблема Pydantic или FastAPI.

Если вы хотите отправить массив с помощью curl, вы должны использовать флаг -d.

In: curl -X GET "http://127.0.0.1:8000/pydanticmodel?field=123"  -d "[\"string\"]"
Out: {"field":"123","directions":["string"]}

Теперь ваш код должен работать отлично.

person Yagiz Degirmenci    schedule 14.09.2020