如何在 FastAPI 中禁止空参数?

koz*_*man 4 python python-3.x pydantic fastapi

我有这样的 FastAPI 函数:

@router.post("/test/")
async def test(ids: List[str] = Body(..., )):
    # some logic
Run Code Online (Sandbox Code Playgroud)

我想要根据需要“ids”字段并传递诸如[“1”,“2”]之类的值。如果我通过一个有效的列表,它工作正常。但是如果我传递空列表 - [],这也将是有效的参数,我不希望这样。我可以很容易地编写自己检查它的函数,但从我对这个美妙框架的经验来看,FastAPI 已经涵盖了它,但我只是不知道如何实现。

JPG*_*JPG 5

方法1:使用字段验证器——(Pydantic Doc)

from pydantic import BaseModel, validator


class MyModel(BaseModel):
    ids: List[str] = []

    @validator('ids', pre=True, always=True)
    def validate_ids_length(cls, value):
        if len(value) == 0:
            raise ValueError("empty list not allowed")
        return value


@demo_app.post("/test/")
async def test(data: MyModel = Body(...)):
    return data
Run Code Online (Sandbox Code Playgroud)

方法 2:使用--(Pydantic Doc)min_items的参数Field

from pydantic import BaseModel, Field


class MyModel(BaseModel):
    ids: List[str] = Field(..., min_items=1)


@demo_app.post("/test/")
async def test(data: MyModel = Body(...)):
    return data
Run Code Online (Sandbox Code Playgroud)

示例 cURL 请求:

curl -X POST "http://0.0.0.0:8000/test/" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"ids\":[\"string\"]}"
Run Code Online (Sandbox Code Playgroud)