不管我们做什么应用,只要和用户输入打交道,就有一个原则–永远不要相信用户的输入数据。意味着我们要对用户输入进行严格的验证,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

自定义错误

SchemaAndOrUse等类都有一个参数error,可以自定义错误信息:

from schema import Schemaprint Schema(int, error='只能是整数类型').validate('abc')      # schema.SchemaUnexpectedTypeError: 只能是整数类型

Python-schema的使用相关推荐

  1. Python著名的lib和开发框架(均为转载)

    第一,https://github.com/vinta/awesome-python Awesome Python A curated list of awesome Python framework ...

  2. 「Spark从入门到精通系列」4.Spark SQL和DataFrames:内置数据源简介

    来源 |  Learning Spark Lightning-Fast Data Analytics,Second Edition 作者 | Damji,et al. 翻译 | 吴邪 大数据4年从业经 ...

  3. MySQL Schema设计(三)利用Python操作Schema

    来源:http://blog.itpub.net/26515977/viewspace-1208256/ 本文中 SQLAlchemy部分可参考http://www.liaoxuefeng.com/w ...

  4. python操作hive数据库代码_python导出hive数据表的schema实例代码

    本文研究的主要问题是python语言导出hive数据表的schema,分享了实现代码,具体如下. 为了避免运营提出无穷无尽的查询需求,我们决定将有查询价值的数据从mysql导入hive中,让他们使用H ...

  5. Python 使用Schema 实现接口或方法的JSON格式参数的高效、优雅校验

    我们在实际开发过程中,在开发对外开放接口或者公共模块方法,通常会对入参进行校验,当入参为JSON (Dict)类型数据时,可能需要写几十行代码来校验其数据格式是否符合正确,使得代码冗余度高,可读性差. ...

  6. schema list validator --python cerberus

    工作中需要对如下json结构进行验证: "ActiveStatus" : [{"effectiveDates" : {"effectiveFrom&q ...

  7. 抖之恒科技python常用库之工具库schema

    在Python编程语言中,有众多的开源库可以帮助程序员更加高效地完成各种任务.其中,Schema就是一款非常实用的工具库之一.本文将为您介绍Schema库的基本概念.使用方法以及它在Python编程中 ...

  8. 【Python】Json Schema的使用【原创】

    Json Schema在Python中的应用 一. 背景 二.概述 三.介绍 四.Python中使用 五.例子 六.参考 一. 背景 之前在做容器发布系统的时候,在部署时需要对提交的deploymen ...

  9. python读取数据校验数据_Python通过Schema实现数据验证方式

    Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端AP ...

  10. Python Re 模块超全解读!详细

    内行必看!Python Re 模块超全解读! 2019.08.08 18:59:45字数 953阅读 121 re模块下的函数 compile(pattern):创建模式对象 > import ...

最新文章

  1. php mvc实例下载,php实现简单的MVC框架实例
  2. 栈与队列7——单调栈结构(初阶问题)
  3. java c 流_java对象传输流C/S传输对象
  4. 【爬蟲】使用Jsoup解析文档
  5. c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现
  6. memcache and redis
  7. java集合框架 改写_Java集合框架1
  8. 最新邮箱密码破解方法
  9. echarts 画正弦曲线
  10. matlab实现退化模型,数字图像处理Matlab退化模型示例(example0507).docx
  11. 零基础html5网站开发学习步骤方法
  12. 移动数据Moving Data
  13. 招商银行一网通H5接口调试和测试报告撰写注意事项
  14. 海康大华安防网络摄像头Onvif、RTSP网络无插件直播流媒体服务解决方案EasyNVR表单重复提交的优化方案
  15. C++ 学习(四)程序流程结构 - 顺序结构、选择结构、循环结构、跳转语句
  16. SAP PS 第八节 PS 常见问题处理-来源于SAP EPPM分享
  17. 人工智能必备数学基础--精华笔记
  18. 百练noi 20:反反复复
  19. antdv tabs闪动
  20. Spring Mybatis 异常报错:org.springframework.core.annotation.AnnotationUtils.clearCache()V

热门文章

  1. nginx静态资源跨域配置
  2. 2017-2018网络攻防技术第八周作业
  3. 20.进入商品详情页Detail
  4. js增加标签(增加元素)和删除标签(删除元素)
  5. 金蝶eas账套连接外部数据库
  6. 9-Linux_系统介绍
  7. 简单介绍一下Serverless和Faas
  8. python接口测试第二期_使用python进行接口测试(二)
  9. gitLab ssh密匙配置
  10. c++算术运算符、逻辑运算符、关系运算符