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

5

Schema(lambda x: 0

SchemaError: (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通过Schema实现数据验证方式相关推荐

  1. python读取word指定内容_python解析html提取数据,并生成word文档实例解析

    简介 今天试着用ptyhon做了一个抓取网页内容,并生成word文档的功能,功能很简单,做一下记录以备以后用到. 生成word用到了第三方组件python-docx,所以先进行第三方组件的安装.由于w ...

  2. python读取word指定内容_python读取word 中指定位置的表格及表格数据

    1.Word文档如下: 2.代码 # -*- coding: UTF-8 -*- from docx import Document def readSpecTable(filename, specT ...

  3. python读取数据集前十行_Python读取数据集并消除数据中的空行方法

    如下所示: # -*- coding: utf-8 -*- # @ author hulei 2016-5-3 from numpy import * import operator from os ...

  4. python读取数据集的方法_Python读取数据集并消除数据中的空行方法

    如下所示: # -*- coding: utf-8 -*- # @ author hulei 2016-5-3 from numpy import * import operator from os ...

  5. python读取pcap获得端口_Python处理网络数据包示例(pcapy读pcap文件)

    Python处理网络数据包示例(pcapy读pcap文件) 最近在围观python,找了个pcapy处理pcap数据的代码 非常非常久以前的东西了,应该是在项目组做的半成品吧.今天重装机器,不经意翻出 ...

  6. python动态爬取实时_python爬取动态数据实战---猫眼专业版-实时票房(二)

    学习python进行简单的数据爬取(基于python 3.x).再进行数据页面解析之后,使用scrapy框架进行爬取数据.没有实现自己预想的效果,着实是自己能力有限,无法灵活使用该框架.就使用自己的办 ...

  7. python表格多列合并_python 合并excel表格数据-如何用python从excel中同时提取两个列的数据,并生成dict(用xlrd)...

    用Python导出工程文件两个子页里的数据成为两个excel表格,但我想把它合并成个一个excel表格的两个sheet 可以采用一些操作Excel块去实现,比如xlrd.xlwt.openpyxl.x ...

  8. python写彩票抓取_Python|爬取彩票数据

    pyhton|爬取彩票数据 背景:作者之前看到过不少朋友介绍利用python环境来爬取彩票数据的文章,方法大致都很类似,今天我也讲一下关于传统方法解析网页获得数据,同时给大家介绍一种可能被大家忽略的方 ...

  9. python的json格式输出_python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

最新文章

  1. 一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
  2. vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
  3. Zookeeper 安装和配置---学习一
  4. CNN的稀疏结构分析-CVPR2018
  5. 奉献给你:《Visual C# 2005程序开发与界面设计秘诀》
  6. 【福利】爱德华·阿什福德·李:人类与AI技术将是共生关系
  7. 如何用10万资金炒房到1000万
  8. Android多线程操作——线程池管理综述
  9. 【JSON】FastJson 打印输格式化输出
  10. sf | 空间矢量对象的“聚合”操作
  11. 2021年福建高考成绩位次查询,2021年福建普通高考理科成绩一分一段表汇总(成绩排名查询)...
  12. 【WPF】添加自定义字体
  13. 【ora10,4】oracle后台进程介绍:
  14. finally引起的异常丢失问题
  15. C# typeof()实例详解
  16. c++超详细基础教程(快速入门)
  17. Druid SQL注入检测
  18. linux怎样补丁更新光盘,给Ubuntu也做个“SP3”补丁包光盘
  19. 黑苹果 中文四叶草下载
  20. 【React】facebook最新状态管理库Recoil

热门文章

  1. Bootstrap笔记
  2. Mybatis学习记录-使用问题总结之一DISTINCT
  3. 洛谷.4234.最小差值生成树(LCT)
  4. iOS 中的网络请求 (同步请求、异步请求、GET请求、POST请求)
  5. Json的序列化和反序列化
  6. gridview列 数字、货币和日期 显示格式
  7. 在做会员资料修改时,实现下拉菜单的默认项定位
  8. 24/4毕业设计小记
  9. CUDA Samples: Julia
  10. 在Windows7/10上快速搭建深度学习框架Caffe开发环境