Python-schema的使用
不管我们做什么应用,只要和用户输入打交道,就有一个原则–永远不要相信用户的输入数据。意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证。一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢?Schema就派上用场了。
安装
pip install schema
Schema
基本类型:满足条件后会返回当前的值,不满足将报错!
from schema import Schemaprint Schema(int).validate(10) # 10
print Schema(int).validate('10') # schema.SchemaUnexpectedTypeError
list/tuple/set:只需满足list/tuple/set
中的其中一个条件后会返回当前的值,不满足将报错!!
from schema import Schemaprint Schema([int, float]).validate([1, 2, 3, 3.3]) # [1, 2, 3, 3.3]
print Schema([int, float]).validate([1, 2, 3, 4]) # [1, 2, 3, 4]
print Schema([int, float]).validate(['a', 'b', 'c', 'd']) # schema.SchemaError
字典:首先,模型字典与数据字典的Key是否完全一样,不一样将报错;而后,那数据字典的value验证模型字典相应的value,如果验证通过才会返回数据,否则将会报错
from schema import Schemaprint Schema({"name": str, "age": int}).validate({"name": "laozhang", "age": 18}) # {'age': 18, 'name': 'laozhang'}
print Schema({"name": str, "age": int}).validate({"name": "laozhang"}) # schema.SchemaMissingKeyError
print Schema({"name": str, "age": int}).validate({"name": 18, "age": 18}) # schema.SchemaError
print Schema({"name": str, "age": int}).validate({"name": 18, "age": 18, "addr": "广东"}) # schema.SchemaWrongKeyError
有个概念值得注意:Schema
传入的字典,我们通常称之为模型字典,validate
传入的字典,我们通常称之为数据字典
可调用的对象:满足可调用的对象的条件后会返回当前的值,不满足将报错!
from schema import Schemaprint Schema(lambda x: 1 < x < 8).validate(5) # 5
print Schema(lambda x: 1 < x < 8).validate(8) # schema.SchemaError
Use
Use
在验证的时候,会自动帮你转换它的值
from schema import Schema, Useprint Schema(Use(int)).validate(10) # 10-->int类型
print Schema(Use(int)).validate('10') # 10-->int类型
print Schema(Use(int)).validate('xiaoming') # schema.SchemaError
Const
我们知道Use
在验证的时候,会自动帮你转换它的值。Const
可以保持原始数据不变:
from schema import Schema, Use, Constprint Schema(Const(Use(int))).validate('10') # 10-->str类型
And
And
对是否满足多个条件进行验证
from schema import Schema, Andprint Schema(And(int, lambda x: x < x < 8)).validate(5) # 5
print Schema(And(int, lambda x: x < x < 8)).validate(8) # schema.SchemaError
print Schema(And(int, lambda x: x < x < 8)).validate('5') # schema.SchemaError
Or
Or
对是否满足其中一个条件进行验证
from schema import Schema, Or, Useprint Schema(Or(lambda x: 1 < x < 8, Use(int))).validate(5) # 5-->int类型
print Schema(Or(lambda x: 1 < x < 8, Use(int))).validate(8) # 8-->int类型
print Schema(Or(lambda x: 1 < x < 8, Use(int))).validate('8') # 8-->int类型
print Schema(Or(lambda x: 1 < x < 8, Use(int))).validate('xiaoming') # schema.SchemaError
Optional
Schema
传入字典进行验证很好用,可是常常因为传入的字典与模型字典key不匹配,从而导致报错,此时我们可以使用Optional
进行可选验证字典:
from schema import Schema, Optionalprint Schema({"name": str, Optional("age"): int}).validate({"name": "laozhang"}) # {'name': 'laozhang'}
print Schema({"name": str, Optional("age"): int}).validate({"name": "laozhang", "age": 18}) # {'age': 18, 'name': 'laozhang'}
print Schema({"name": str, Optional("age"): int}).validate({"name": 18, "age": 18}) # schema.SchemaError
print Schema({"name": str, Optional("age"): int}).validate({"name": "laozhang", "age": 18, "addr": "广东"}) # schema.SchemaWrongKeyError
我们还可以在Optional
中设置一个默认值,如下:
print Schema({"name": str, Optional("age", default=18): int}).validate({"name": "laozhang"}) # {'age': 18, 'name': 'laozhang'}
上面这种方式只是用于数据字典的key比模型字典的key少的情况,如果数据字典的key比模型字典的多,那么又该如何进行忽略验证呢?我们可以使用ignore_extra_keys
参数,并将其设置为True,如下:
from schema import Schemaprint Schema({"name": str, "age": int}, ignore_extra_keys=True).validate({"name": "laozhang", "age": 18, "addr": "广东"}) # {'age': 18, 'name': 'laozhang'}
Forbidden
Forbidden
可以将某个key禁止:
from schema import Schema, Forbiddenprint Schema({Forbidden('name'): str, 'age': int}).validate({"age": 15}) # {"age": 15}
print Schema({Forbidden('name'): str, 'age': int}).validate({"name": "laozhang", "age": 15}) # schema.SchemaForbiddenKeyError
print Schema({Forbidden('name'): str, 'age': int}).validate({"name": 10, "age": 15}) # schema.SchemaWrongKeyError
值得注意的是,与禁用秘钥配对的值将决定了它是否会被拒绝:
from schema import Schema, Forbiddenprint Schema({Forbidden('name'): int, 'name': str}).validate({'name': 'laozhang'}) # {'name': 'laozhang'}
print Schema({Forbidden('name'): str, 'name': str}).validate({'name': 'laozhang'}) # schema.SchemaForbiddenKeyError
另外,Forbidden
的优先级要比Optional
要高:
from schema import Schema, Forbidden, Optionalprint Schema({Forbidden('name'): str, Optional('name'): str}).validate({"name": "laozhang"}) # schema.SchemaForbiddenKeyError
Regex
Regex
可以根据正则表达式进行匹配验证
import re
from schema import Regexprint Regex('^foo').validate('football') # football
print Regex('^foo').validate('basketball') # schema.SchemaError# flags=re.I忽略大小写
print Regex('[A-Z]+', flags=re.I).validate('football') # football
当然,Regex
同样也可以配合Schema
一起使用:
from schema import Schema, Regexprint Schema(Regex('^foo')).validate('football') # football
自定义错误
Schema
、And
、Or
、Use
等类都有一个参数error
,可以自定义错误信息:
from schema import Schemaprint Schema(int, error='只能是整数类型').validate('abc') # schema.SchemaUnexpectedTypeError: 只能是整数类型
Python-schema的使用相关推荐
- Python著名的lib和开发框架(均为转载)
第一,https://github.com/vinta/awesome-python Awesome Python A curated list of awesome Python framework ...
- 「Spark从入门到精通系列」4.Spark SQL和DataFrames:内置数据源简介
来源 | Learning Spark Lightning-Fast Data Analytics,Second Edition 作者 | Damji,et al. 翻译 | 吴邪 大数据4年从业经 ...
- MySQL Schema设计(三)利用Python操作Schema
来源:http://blog.itpub.net/26515977/viewspace-1208256/ 本文中 SQLAlchemy部分可参考http://www.liaoxuefeng.com/w ...
- python操作hive数据库代码_python导出hive数据表的schema实例代码
本文研究的主要问题是python语言导出hive数据表的schema,分享了实现代码,具体如下. 为了避免运营提出无穷无尽的查询需求,我们决定将有查询价值的数据从mysql导入hive中,让他们使用H ...
- Python 使用Schema 实现接口或方法的JSON格式参数的高效、优雅校验
我们在实际开发过程中,在开发对外开放接口或者公共模块方法,通常会对入参进行校验,当入参为JSON (Dict)类型数据时,可能需要写几十行代码来校验其数据格式是否符合正确,使得代码冗余度高,可读性差. ...
- schema list validator --python cerberus
工作中需要对如下json结构进行验证: "ActiveStatus" : [{"effectiveDates" : {"effectiveFrom&q ...
- 抖之恒科技python常用库之工具库schema
在Python编程语言中,有众多的开源库可以帮助程序员更加高效地完成各种任务.其中,Schema就是一款非常实用的工具库之一.本文将为您介绍Schema库的基本概念.使用方法以及它在Python编程中 ...
- 【Python】Json Schema的使用【原创】
Json Schema在Python中的应用 一. 背景 二.概述 三.介绍 四.Python中使用 五.例子 六.参考 一. 背景 之前在做容器发布系统的时候,在部署时需要对提交的deploymen ...
- python读取数据校验数据_Python通过Schema实现数据验证方式
Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端AP ...
- Python Re 模块超全解读!详细
内行必看!Python Re 模块超全解读! 2019.08.08 18:59:45字数 953阅读 121 re模块下的函数 compile(pattern):创建模式对象 > import ...
最新文章
- php mvc实例下载,php实现简单的MVC框架实例
- 栈与队列7——单调栈结构(初阶问题)
- java c 流_java对象传输流C/S传输对象
- 【爬蟲】使用Jsoup解析文档
- c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现
- memcache and redis
- java集合框架 改写_Java集合框架1
- 最新邮箱密码破解方法
- echarts 画正弦曲线
- matlab实现退化模型,数字图像处理Matlab退化模型示例(example0507).docx
- 零基础html5网站开发学习步骤方法
- 移动数据Moving Data
- 招商银行一网通H5接口调试和测试报告撰写注意事项
- 海康大华安防网络摄像头Onvif、RTSP网络无插件直播流媒体服务解决方案EasyNVR表单重复提交的优化方案
- C++ 学习(四)程序流程结构 - 顺序结构、选择结构、循环结构、跳转语句
- SAP PS 第八节 PS 常见问题处理-来源于SAP EPPM分享
- 人工智能必备数学基础--精华笔记
- 百练noi 20:反反复复
- antdv tabs闪动
- Spring Mybatis 异常报错:org.springframework.core.annotation.AnnotationUtils.clearCache()V