输入与输出验证--fastapi教程系列

概述

本文主要讲解如何使用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、enum、union

复合数据类型主要是列表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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值