FastAPI教程——请求参数验证
在上篇文章学习了,这篇学习FastAPI教程——请求参数验证。如下图所示:当我们传递的参数类型不正确时会报错。注意:即使给路径参数设置默认值,默认值也会无效。
在上篇文章学习了FastAPI教程——请求,这篇学习FastAPI教程——请求参数验证。
FastAPI的参数验证是基于Pydantic实现的,它可以自动对客户端传递的请求参数进行类型校验,基础语法格式如下:
参数名:参数类型 | 参数类型=默认值
示例代码如下:
@app.get('/item1')
async def Get_item1(item1: int | int=123):
return {"参数验证:": {item1}}
如下图所示:

当我们传递的参数类型不正确时会报错。
注意:即使给路径参数设置默认值,默认值也会无效。
Union联合类型
当我们希望参数的类型是多种时,可以使用Union、Optional实现,其语法格式如下:
# Union 方式
参数名:Union[参数类型1,...,参数类型n]
# Optional 方式
参数名:Optional[参数类型1,,...,参数类型n]
示例代码如下:
from typing import Union, Optional
@app.get('/item1/{item1}')
async def Get_item1(item1: Union[int, bool]):
return {"Union方式:": {item1}}
@app.get('/item3')
async def Get_item3(item3: Optional[int | bool]):
return {"Optional方式:": item3}
运行结果如下:

当然,使用联合类型Union也可以为参数设置默认值,示例代码如下:
@app.get('/item1')
async def Get_item1(item1: Union[int, bool] | int=123):
return {"Union方式:": {item1}}
在Python3.10+中,Union联合类型可以简写为|,其语法格式如下:
参数名:参数类型1 | 参数类型2 | 参数类型n | 参数类型=默认值
示例代码如下:
@app.get('/item2/{item2}')
async def Get_item2(item2: int | float):
return {"|方式:": item2}
注意:Union联合类型的类型顺序是很重要的,当类型顺序为:int、str时,输入123,参数会解析为数字123,而不是字符串123。
容器数据类型
当参数类型为列表、字典、集合等复杂类型时,我们称为容器数据类型,可以使用List、dict、tuple、set实现,其语法格式如下:
参数名: List[参数类型 | 参数类型]
参数名: Dict[参数类型, 参数类型]
参数名: Tuple[参数类型, 参数类型]
参数名: Set[参数类型 | 参数类型]
示例代码如下:
from typing import List, Dict, Tuple, Set
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ItemRequest(BaseModel):
a: List[str]
b: Dict[str, str]
c: Tuple[str, str]
d: Set[str]
@app.post("/items")
async def read_items(item: ItemRequest):
return {
"a": item.a,
"b": item.b,
"c": item.c,
"d": item.d
}
if __name__ == '__main__':
uvicorn.run('main:app', host='127.0.0.1', port=8004, reload=True)
运行结果如下:

注意:路径参数不能使用复杂数据类型。
枚举类型
枚举类型可以让我们是输入更规范,其示例代码如下:
from enum import Enum
import uvicorn
from fastapi import FastAPI
app = FastAPI()
class ModelName(str,Enum):
apple='苹果'
banana='香蕉'
@app.get("/items/{q}")
def read_items(q: ModelName):
return {"q": q}
if __name__ == '__main__':
uvicorn.run('main:app', host='127.0.0.1', port=8006, reload=True)
如下图所示:

Path、Query验证
在FastAPI中,可以使用Path、Query对参数进行校验,其中:
-
Path:用于路径参数的验证和元数据配置工具,可以对URL路径参数做类型、范围、格式等校验;
-
Query:用于查询参数的验证和元数据配置工具,可以对URL查询参数做类型、范围、格式等校验;
当不符合规则时自动返回422错误。
其语法格式如下:
参数名: 参数类型=Path(参数)
参数名: 参数类型=Query(参数)
Path和Query的参数相同,常用的参数如下表:
| 参数 | 描述 | 示例 | 示例描述 |
|---|---|---|---|
| .../None | 必填值/可选值 | q: int=Path/Query(...) | q为必填值 |
| default | 默认值 | q: str=Query(default='白巧克力') | q的默认值为白巧克力 |
| alias | 别名,修改前端传递的参数名 | Q: str=Path/Query(alias='q') | 将q改为Q,后端接收Q |
| title | 参数标题 | q: str=Path/Query(title='数据参数') | q的标题为数据参数 |
| description | 参数描述 | q: str=Path/Query(description='用来获取查询数据') | q参数的作用描述 |
| gt、ge、lt、le | 数值大于、大于等于、小于、小于等于 | q: int=Path/Query(ge=1,lt=10) | q的值必须大于等于1,小于10 |
| min_length、max_length | 字符串最小长度、最大长度 | q: str=Path/Query(max_length=10) | q的最大长度为10 |
| pattern | 规定传入参数的格式 | q: str = Path/Query(pattern=r'^1[3-9]\d{9}$') | q的格式为1开头的11位数字 |
| multiple_of | 数值为multiple_of的倍数 | q: int=Path/Query(multiple_of=3) | q为3的倍数 |
| max_digits | 数值总位数,类型必须为Decimal | q: Decimal=Path/Query(max_digits=3) | 整数和小数的总位数小于等于3 |
| decimal_places | 小数位的位数,类型必须为Decimal | q: Decimal=Path/Query(decimal_places=3) | 小数的位数小于等于3 |
| examples | 在redoc文档,理解如何正确使用API接口 | q: float=Path/Query(examples=[ {'q': 12.12} ]) | 告诉使用者输入格式 |
| example | 在redoc文档,理解如何正确使用API接口 | q: float=Path/Query(examples=123) | 告诉使用者输入格式 |
| openapi_examples | 为API文档提供更详细的示例配置 | q: float = Path/Query(openapi_examples={"Q": {"summary": "查询", "description": "输入格式","value": 12.12}}) | 为API文档提供更详细的示例配置 |
| deprecated | 弃用参数 | q: float=Path/Query(deprecated=True) | 弃用q参数 |
示例代码如下:
import uvicorn
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items")
def read_items(q: str = Query(default='白巧克力')):
return {"q": q}
if __name__ == '__main__':
uvicorn.run('main:app', host='127.0.0.1', port=8006, reload=True)
这里就不一一写详细代码了,大家感兴趣的话根据上面的是示例来写代码,操作操作。
Field验证
在FastAPI中,Field验证主要用于Pydantic模型中对单个字段进行详细的配置和验证,其语法格式如下:
参数名:参数类型=Field(参数)
Field的参数与Path、Query的参数几乎一样,大家可以看上面的Path、Query的参数。
示例代码如下:
import uvicorn
from fastapi import FastAPI, Path
from pydantic import Field, BaseModel
app = FastAPI()
class User(BaseModel):
name: str = Field(default='默认字段')
age: int = Field(..., ge=3)
@app.post("/items")
def read_items(q: User):
return {"q": q}
if __name__ == '__main__':
uvicorn.run('main:app', host='127.0.0.1', port=8002, reload=True)
注意:get和head请求方法不能使用。
运行结果如下:

好了,FastAPI教程——请求参数验证就讲到这里了。
公众号:白巧克力LIN
该公众号发布Java、Python、数据库、Linux、Flask、Django、自动化测试、Git、算法、前端、服务器、AI等相关文章!
-
END -
更多推荐
所有评论(0)