Python通过Schema实现数据验证方式


Posted in Python onNovember 12, 2020

Schema是什么?

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

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

1. 给Schema类传入类型(int、str、float等)

例如:

from schema import Schema

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

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

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也内置了一些类(Use、And、Or等等),这些类的实例都带有validate方法,亦可作为Schema的参数传入,例如:

from schema import Schema, And

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

4. 给Schema类传入容器对象(list、tuple、set等)

例如:

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

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'}

我想让Schema只验证传入字典中的一部分数据,可以有多余的key但是不要抱错,怎么做?

Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'})
{'age': 100, 'name': 'foobar'}

Schema抛出的异常信息不是很友好,我想自定义错误信息,怎么办?

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

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

SchemaError: 年龄必须是整数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 网络编程起步(Socket发送消息)
Sep 06 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Python可变和不可变、类的私有属性实例分析
May 31 Python
python区块及区块链的开发详解
Jul 03 Python
Django中的FBV和CBV用法详解
Sep 15 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
Python命令行click参数用法解析
Dec 19 Python
python将dict中的unicode打印成中文实例
May 11 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 Python
Django用户认证系统如何实现自定义
Nov 12 #Python
Django自带用户认证系统使用方法解析
Nov 12 #Python
Django多数据库联用实现方法解析
Nov 12 #Python
Django数据库迁移常见使用方法
Nov 12 #Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 #Python
python调用win32接口进行截图的示例
Nov 11 #Python
python 下载m3u8视频的示例代码
Nov 11 #Python
You might like
PHP多态代码实例
2015/06/26 PHP
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python解决鸡兔同笼问题的方法
2014/12/20 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
python实现图片中文字分割效果
2019/07/22 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
python画图常规设置方式
2020/03/05 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Python celery原理及运行流程解析
2020/06/13 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
Python连接mysql方法及常用参数
2020/09/01 Python
香港通票:Hong Kong Pass
2019/02/26 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
机电工程专业应届生求职信
2013/10/03 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
2014年情人节活动方案
2014/02/16 职场文书
公司保密承诺书
2014/03/27 职场文书
安全员岗位职责
2015/02/10 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js