如何禁止 FastAPI 中的空参数?

How to disallow empty parameters in FastAPI?

我有这样的 FastAPI 函数:

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

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

我终于找到了解决方案(经过大约 half-hour 的研究)- 在 pydantic 中,您可以通过 min_items 来指示传递列表中的最小项目数。
有关选项的更多信息: https://pydantic-docs.helpmanual.io/usage/schema/#field-customisation

所以最后,pydantic + FastAPI 对我来说是这样的:

@router.post("/test/")
async def test(ids: List[str] = Body(..., min_items=1)):
    # some logic

在这种情况下,我们获得了 pydantic 的功能,但不需要 pydantic BaseModel class

我更喜欢 validator,因为大多数端点不会像这样简单。

from pydantic import validator, BaseModel
from fastapi import FastAPI, Body
from typing import List

app = FastAPI()


class User(BaseModel):
    ids: List[str]

    @validator("ids", pre=True, always=True)
    def check_ids(cls, ids):
        assert len(ids) > 0, "ID's cannot be empty."
        return ids


@app.post("/test")
async def get_ids(user: User = Body(...)):
    return user

方法一:使用字段validator -- (Pydantic Doc)

from pydantic import BaseModel, validator


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

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


@demo_app.post("/test/")
async def test(data: <b>MyModel</b> = Body(...)):
    return data

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

from pydantic import BaseModel, Field


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


@demo_app.post("/test/")
async def test(data: MyModel = Body(...)):
    return data

示例 cURL 请求:

curl -X POST "http://0.0.0.0:8000/test/" -H  "accept: application/json" -H  "Content-Type: application/json" <b>-d "{\"ids\":[\"string\"]}"</b>