本文主要讲解如何使用mypy(typing)和pydantic标注类,实现输入和输出参数序列化(用drf的话叫序列化)。
主要功能就是验证输入参数和输出参数并转换为标准格式
以BaseModel实例为例,实际上数据在basemodel和body等参数使用规则是一致的。
(有价值的参考:https://blog.csdn.net/swinfans/article/details/89629641)
数据类型的核心就在于,一切都基于类,而我们要做的就是把输入输出的数据用类标注出来。
基础类型主要是分为如下几种:int、float、string、bytes,其他的数据类型都是以基础数据类型进行扩展而得到的。
from pydantic import BaseModel
class Test(BaseModel):
int_a:int=None
float_b:float=1.1
str_c:string
bytes_d:bytes # 一般这个是用来返回文件的,主要是获取二进制数据
注意:如果为非必须数据,可以使用=None或等于规定类型数据的方式来提供初始值,当然fastapi也可以设置:如果输入的参数为默认值则不将该结果录入到输入
扩展数据类型主要是指对基础数据类型更多的要求,比如:url类型(string扩展,对数据结构有要求),image类型(对bytes的扩展),datetime类型(属于类类型,实际也是string的扩展)、date类型等等。(甚至你可以自己定义类型)
这里举个简单的例子:
from pydantic import HttpUrl, BaseModel
from datetime import datetime # 这里还包括date、datetleta
class Test(BaseModel):
url:HttpUrl
t:datetime
常用类型:我能看懂的如下:
# network
'AnyUrl', 'AnyHttpUrl', 'HttpUrl', 'stricturl', 'EmailStr', 'NameEmail', 'IPvAnyAddress', 'IPvAnyInterface',
'IPvAnyNetwork', 'PostgresDsn', 'UUID1', 'UUID3', 'UUID4', 'UUID5', 'FilePath', 'DirectoryPath', 'Json',
# 非pydantic包里面的类型
# from datetime
'datetime', 'date',
# from typing
'List', 'Dict', 'Set', 'Enum', 'Union'
更多的基础数据类型请自行参考pydantic的文档。也可以自己写验证数据的方法然后
复合数据类型主要是列表list,字典dict,集合set等。定义方式与基础数据类型最大的区别就是,这些类型主要是存储多个基础数据类型的。
要定义这些数据,需要有一点c语言的思维,单纯用list进行标注,有时候并不能得到更好的数据验证。
比如我只想list存储数字,那么就不能存储字符串,这种情况可以这么写list_e:List[int]
,如果单纯想存数字和bytes,可以这么写:list_f:List[int,bytes]
。方括号里面是可选的类型。如果想让该值也可以为空,则需要使用Optional
进行包装:Optional[List[int,bytes]]
这里我举一些常见结构:
from typing import Optional, Dict, Union,List
class TestTuping(BaseModel):
dict_a: Dict[str,Union[str,int]] = {"chise": "asd","abc":4}#字典的键必须是str,值必须为int或str。注意dict_a不能为None
list_b:Optional[List[int]]#dict_b可以为None,或者元素全部是int的list类型,Set,tuple参考这一条,
dict_c:dict_c:Dict[str,HttpUrl]#当然也可以使用上述的扩展数据类型。(自定义的也可以使用)
由于pydantic可以做嵌套,所以我们可以自己定义数据验证,下面是一个简单的自定义数据验证例子:
from pydantic import ValidationError
class Url(BaseModel):
url: str
@validator('url')
def url_must_contain_space(cls, v):
if ' ' not in v:
raise ValidationError('must contain a space')#如果错误就触发这个错误
return v#如果正确就返回结果
#使用方式如下:
class NANME(BaseModel):
url:Url
可以在BaseModel的继承类里面使用class config进行一些配置:
class Test(BaseModel):
i:int
class config:
min_anystr_length=True
...
config的常用部分配置如下:
Config 类包含如下一些类属性:
anystr_strip_whitespace:是否消除字符串或者字节的前导和后置空白空格。默认为 False。
min_anystr_length:字符串或字节的最小长度。默认为0。
max_anystr_length:字符串或字节的最大长度。默认为 2 ** 16
validate_all:是否验证字段的默认值。默认为 False。
extra:是否忽略、允许或禁止模型中的额外属性。可以使用字符串值 ignor,allow或 forbid,也可以使用 Extra 的枚举值。默认值是 Extra.ignore。
use_enum_values:是否使用枚举的 value 特性填充模型,而不是使用原始枚举。这在您希望序列化 model.dict() 时非常有用。默认值为 False。
validate_assignment:是否在为属性赋值时执行验证。默认为 False。