前言
本文是该专栏的第3篇,后面会持续分享FastApi以及项目实战的各种干货知识,值得关注。
继本专栏上一篇详细介绍FastApi的参数接收,本文再详细来介绍FastApi的参数验证。在python中推荐使用成熟的第三方库进行数据验证,这样不仅可以少写一些if .. else语句,还能让代码的可读性更强。
而本文要介绍的参数验证,这里就需要用到Pydantic,它是一个用于数据验证和设置的python库,特别是用于验证数据模型。它通过声明性的方式定义数据模型,并提供了强大的数据验证和转换功能。Pydantic最初是为FastApi框架设计的,但它也可以在其它python项目中独立使用。
而针对在参数验证中,需要注意的使用事项以及相关知识点将结合实际项目代码进行详细说明,下面跟着笔者直接往下看正文。(附带完整代码)
正文
需要注意的是,本文提及和使用到的pydantic版本为: 1.10.11,而不同的pydantic版本,可能会存在差异。使用pydantic的本质,其实就是如何编写对应的数据验证规则,接下来,将结合实际代码例子进行说明。
1. 常用验证
如下所示,是一些比较常用的验证规则:
基本数据类型:int,float,str,bool;
可选参数:Optional[type] 表示可选参数,Union[x,None] 也可以表示可选;
整数范围:结合conint函数判断数字范围,比如age:conint(ge=18, le=30);需要注意的是,这里的ge:表示大于等于,gt:大于,le:小于等于,lt:小于;
字符长度:结合constr函数判断字符长度,比如constr(min_length=6, max_length=10);
正则表达式:使用constr函数中的参数regex ,可以用于进行正则表达式验证;
枚举验证: 使用Enum 定义枚举类,验证;
列表类型:使用List[type] 来限制列表值的类型,并尝试把参数转成对应的类型;
字典类型: Dict[key_type, value_type] 来限制字典key和val类型,并尝试把参数转成对应的类型。
示例代码如下所示:
from enum import Enum
from typing import Union, Optional, List, Dict# 导入pydantic对应的模型基类
from pydantic import BaseModel, constr, conintclass GenderEnum(str, Enum):"""性别枚举"""male = "男"female = "女"class PydanticVerifyParam(BaseModel):"""用来学习使用pydantic模型验证"""user_name: str # 基本类型age: conint(ge=18, le=30) # 整数范围:18 <= age <= 30password: constr(min_length=6, max_length=10) # 字符长度phone: constr(regex=r'^1\d{10}$') # 正则验证手机号address: Optional[str] = None # 可选参数sex: GenderEnum # 枚举验证,只能传: 男和女likes: List[str] # 值会自动转成传字符串列表scores: Dict[str, float] # key会转成字符串,val 会转成浮点型
需要注意的是,在上面列举的例子,在实际使用中可以组合进行多项“组合”使用,比如items:List[constr(min_length=1, max_length=3)] : 限制列表中的每个字符串长度的范围
2. 自定义验证
在自定义验证中,可以使用@validator装饰器用于定义自定义验证函数,具体代码示例如下:
from pydantic import BaseModel, constr, conint, validator
...
class PydanticVerifyParam(BaseModel):"""用来学习使用pydantic模型验证"""user_name: str # 基本类型...@validator("user_name")def validateUsername(cls, value: str):"""自定义验证函数"""if value.find("傻") > -1:raise ValueError("user_name不能包含敏感词")return value
验证结果,示例如下:
// 当参数user_name传:是不是傻
{"detail": [{"loc": ["body","user_name"],"msg": "user_name不能包含敏感词","type": "value_error"}]
}
3. 其他验证
EmailStr:用于验证字符串是否是有效的电子邮件地址;
IPvAnyAddress:用于验证字符串是否是有效的 IPv4 或 IPv6 地址;
StrictBool:用于验证字符串是否是严格的布尔值(true 或 false);
AnyHttpUrl:用于验证字符串是否是有效的 URL,包括以 http 或 https 开头的 URL
如果还想了解FastApi以及项目实战的其他干货知识,我会在后面持续更新,记得收藏并点赞,后面的python干货在等着你。
如果喜欢本文或者本文对你有帮助的话,记得收藏并点赞,有问题和需求欢迎留言私信。
FastApi-参数接收的正确使用(2)