首页 > 其他分享 >schema模块简介 - 验证数据类型

schema模块简介 - 验证数据类型

时间:2023-05-04 17:45:09浏览次数:42  
标签:name 传入 int 简介 age 数据类型 validate schema Schema

目录

1 schema模块简介

不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据。意味着我们要对用户输入进行严格的验证web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证。一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢?Schema就派上用场了

2 快速上手

Schema非常简单,也就几百行的代码,最核心的类就一个:Schema

1. 给Schema类传入类型(intstrfloat等)

例:

from schema import Schema

Schema(int).validate(10)
10
Schema(int).validate('10')
SchemaUnexpectedTypeError: '10' should be instance of 'int'

可见Schema会去验证validate方法传入的对象是不是所指定的类型,是则返回传入的数据,否则抛出一个SchemaError的异常(SchemaUnexpectedTypeErrorSchemaError的子类)。

2. 给Schema类传入可调用的对象(函数、带__call__的类等)

例如:

Schema(lambda x: 0<x<10).validate(5)
5
Schema(lambda x: 0<x<10).validate(57)
SchemaError: <lambda>(57) should evaluate to True

可见Schema会把validate方法传入的值传入到对应的函数里面作为参数,如果函数返回值为True则返回输入数据,否则抛出异常。

3. 给Schema类传入带有validate方法的对象

Schema也内置了一些类(UseAndOr等等),这些类的实例都带有validate方法,亦可作为Schema的参数传入,例如:

from schema import Schema, And

# And代表两个条件必须同时满足
Schema(And(str, lambda s: len(s) > 2)).validate('abcd')
'abcd'

4. 给Schema类传入容器对象(listtupleset等)

例如:

Schema([int, float]).validate([1, 2, 3, 4.0])
[1, 2, 3, 4.0]

相当于,对于[1, 2, 3, 4.0]当中的任何一个元素,必须是int或者float才行(注意是or的关系)

5. 给Schema传入一个字典对象(大部分使用Schema的场景都是传入字典对象,这个很重要)

Schema({'name': str, 'age': int}).validate({'name': 'foobar', 'age': 18})
{'age': 18, 'name': 'foobar'}
Schema({'name': str, 'age': int}).validate({'name': 'foobar'})
SchemaMissingKeyError: Missing keys: 'age'

首先,明确两个概念,Schema类传入的字典,称之为模式字典valdiate方法传入的字典称之为数据字典

首先,Schema会判断, 模式字典和数据字典的key是否完全一样,不一样的话直接抛出异常。如果一样,就去拿数据字典的value去验证模式字典相应的value,如果数据字典的全部value都可以验证通过的话才返回数据,否则抛出异常,是不是感觉这种验证顿时感觉清爽了呢?

6. faqs

  1. Schema传入字典很好用,但是我有的数据是可选的,也就是说有的key可以不提供怎么办?
from schema import Optional, Schema


Schema({'name': str, Optional('age'): int}).validate({'name': 'foobar'})
{'name': 'foobar'}
Schema({'name': str, Optional('age', default=18): int}).validate({'name': 'foobar'})
{'age': 18, 'name': 'foobar'}
  1. 我想让Schema只验证传入字典中的一部分数据,可以有多余的key但是不要抱错,怎么做?
Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'})
{'age': 100, 'name': 'foobar'}
  1. Schema抛出的异常信息不是很友好,我想自定义错误信息,怎么办?

Schema自带的类(UseAndOrRegexSchema等)都有一个参数error,可以自定义错误信息

Schema({'name': str, 'age': Use(int, error='年龄必须是整数')}).validate({'name': 'foobar', 'age': 'abc'})
SchemaError: 年龄必须是整数

标签:name,传入,int,简介,age,数据类型,validate,schema,Schema
From: https://www.cnblogs.com/DuoDuosg/p/17372026.html

相关文章

  • 5、MySQL的SQL语言、数据库管理、数据类型及DQL的单、多表查询
    进入mysql后,使用help列出的是客户端的命令,使用helpcontents列出服务端命令SQL语句分类(DDLDMLDQL要记住)前三个重要(DDL、DML、DQL、DCL、TCL)DDL:DataDefinationLanguage数据定义语言CREATE,DROP,ALTER(对数据库、表、视图、索引进行创建、删除和更改的工具ALTER改格式)......
  • StE355钢板简介、StE355执行标准、StE355化学成分
    1、StE355钢板简介:StE355是欧洲低合金钢板牌号,执行标准DIN17102,生产厚度8mm-500mm之间,StE355一热轧状态交货,StE355原厂质保书屈强参数StE355德标商标,StE355是低合金结构钢。StE355钢板自身不仅有着非常高的强度而且还具备一定的韧性、抗疲劳性、抗冲击性、耐磨性、焊接及易加工性能......
  • SpringSecurity简介
    ------------恢复内容开始------------SpringSecurity简介SpringSecurity是spring家族中的一个安全框架,相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富一般来说中大型的项目都是使用springsecurity来做安全框架,小项目有Shiro的比较多,因为相比与Spri......
  • 23 IIC(一)IIC协议简介
    1硬件连接IIC硬件接线一般如下所示。从主控芯片引出两根线SCL和SDA。外加一个上拉电阻2数据传输格式2.1写操作主控芯片发出start信号主控芯片发出一字节的数据。前7bit为设备地址,最后一bit为方向:0表示写,1表示读主设备等待从设备应答主设备接到从设备的应答后开始发送......
  • dockerfile概念简介——镜像分层
    一、dockerfile概念dockerfile是自定义镜像的一套规则dockerfile由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层1.1docker镜像的分层dockerfile的原理就是镜像分层。Dockerfile中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后......
  • C++/PTA 函数重载(数据类型不同)
    题目要求用同一个函数名对n(n<=10)个数据进行从小到大排序,数据类型可以是整数、浮点数,用函数重载实现。输入格式:输入n例如3输入n个整数,例如1089输入n个浮点数例如10.235.167.99输出格式:输出n个整数的升序排列:8910以空格间隔,并以空格结尾换行,输出n个浮点数的升......
  • 组织简介&成员介绍
    紫水晶实验室(AmethystLab)由一群可能改变世界的人组成。该账号用于对成员的博文进行转载与分享。成员:SijunMa:兴趣方向为集成电路、信号处理。博客园:https://www.cnblogs.com/SijunMa/czg-bky:对无人驾驶、深度学习和黑丝很感兴趣。博客园:https://home.cnblogs.com/u/czg-bky/......
  • Vue.js 简介与入门指南
    Vue.js是一个轻量级的JavaScript框架,用于构建交互式的用户界面。Vue.js的核心是一个用于构建组件化应用的视图层库,它易于上手,且能够快速地构建出高效、灵活、易于维护的应用程序。Vue.js受到了许多开发者的欢迎,因为它允许使用简单的HTML模板来创建可重用的组件,这些组件可以......
  • 7-001-七期简介及动态规划快速复习
    1.题目读题 考查点 2.解法思路 代码逻辑 具体实现113.总结......
  • go 数据类型
    序号类型和描述1布尔型布尔型的值只可以是常量true或者false。一个简单的例子:varbbool=true。2数字类型整型int和浮点型float32、float64,Go语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。3字符串类型:字符串就是一串固定长度的字符连接......