在上篇文章学习了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 -

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐