如何禁止 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>
我有这样的 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>