使用 voluptuous 校验数据
admin
2023-07-31 00:39:14
0

在 Python 中,我们经常需要对参数进行校验,这是我们有好多种方法,例如写很多 if 啊,或者写正则表达式啊等等,技巧高的人可以写得很巧妙,而技巧一般的人呢,可能会写得很冗长,例如我,经常就不能很好得处理参数校验的代码。

所以我就不断得寻找,终于最近发现了一个不错的 python 参数校验 lib,叫做 voluptuous。名字可能有点难记,而且英文翻译过来的中文还不怎么好听,但是非常好用。下面就逐渐带大家尝试一下 voluptuous 库的妙用。

安装 voluptuous

要用之前,肯定要先安装的啦,安装这一步很简单,还是按照往常一般使用 pip 搞定。我使用的是当前的最新版 0.8.8:

1 pip install voluptuous==0.8.8

尝试 voluptuous

首先,想来一个最为常见的,就是校验参数的类型,我这里假设参数都是以 json 格式进行传递的,json 格式在 python 中又可以表现为字典(dict),所以这里就不做区分了。

以官网的日志为例,使用分页的参数为例子,校验参数的类型,首先,我们要求参数的类型,查询的字段q必须为字符串,分页大小per_page必须为数字,页码page必须为数字。

那么,使用 voluptuous 后,可以这样写:

1234567 from voluptuous import Schema s = Schema({    \’q\’: str,    \’per_page\’: int,    \’page\’: int})

这就表示了我们刚才的需求:查询的字段q必须为字符串,分页大小per_page必须为数字,页码page必须为数字。

那么,现在,假设客户端传过来了一组参数:

1234 {\”q\”: \”hello\”, \”page\”: 10, \”per_page\”: 20}

那么,我们要怎么来校验呢?也很简单:

123456789101112 from voluptuous import Schema s = Schema({    \’q\’: str,    \’per_page\’: int,    \’page\’: int}) print s({\”q\”: \”hello\”,          \”page\”: 10,         \”per_page\”: 20        })

这里可以看到,我们使用客户端传递过来的参数作为参数,调用了我们使用既定模板创建的对象,然后直接把他打印出来,如果你跑过这段代码,你会发现结果如下:

1234 {\”q\”: \”hello\”, \”page\”: 10, \”per_page\”: 20}

没错, voluptuous 就是将校验通过的参数返回了。就是这么简单。

那这时,你可能要问了,如果校验不通过的参数怎么办,我要怎么处理,下面就演示一下如果传递的参数是:

1234 {\”q\”: \”hello\”, \”page\”: \”world\”, \”per_page\”: 20}

这样的话,要怎么来处理校验不通过的问题,其实,当校验不通过的时候,Schema 会抛出一个异常,然后我们可以通过捕获这个异常来确定校验失败的问题,例如:

1234 try:    print s({\”q\”: \”hello\”, \”page\”: \”world\”\”per_page\”: 20})except MultipleInvalid as e:    print \”error: {} occur while parse args\”.format(e.errors)

当你执行这段代码之后,你会发现打印出来的内容是:

1 error: [TypeInvalid(\’expected int\’,)] occur while parse args

我们就知道参数是有问题的,需要客户端确认。

更进一n-sy\”>)] occur while parse args

我们就知道参数是有问题的,需要客户端确认。

更进一 Ȭ的人呢,可能会写得很冗长,例如我,经常就不能很好得处理参数校验的代码。

所以我就不断得寻找,终于最近发现了一个不错的 python 参数校验 lib,叫做 voluptuous。名字可能有点难记,而且英文翻译过来的中文还不怎么好听,但是非常好用。下面就逐渐带大家尝试一下 voluptuous 库的妙用。

安装 voluptuous

要用之前,肯定要先安装的啦,安装这一步很简单,还是按照往常一般使用 pip 搞定。我使用的是当前的最新版 0.8.8:

1 pip install voluptuous==0.8.8

尝试 voluptuous

首先,想来一个最为常见的,就是校验参数的类型,我这里假设参数都是以 json 格式进行传递的,json 格式在 python 中又可以表现为字典(dict),所以这里就不做区分了。

以官网的日志为例,使用分页的参数为例子,校验参数的类型,首先,我们要求参数的类型,查询的字段q必须为字符串,分页大小per_page必须为数字,页码page必须为数字。

那么,使用 voluptuous 后,可以这样写:

1234567 from voluptuous import Schema s = Schema({    \’q\’: str,    \’per_page\’: int,    \’page\’: int})

这就表示了我们刚才的需求:查询的字段q必须为字符串,分页大小per_page必须为数字,页码page必须为数字。

那么,现在,假设客户端传过来了一组参数:

1234 {\”q\”: \”hello\”, \”page\”: 10, \”per_page\”: 20}

那么,我们要怎么来校验呢?也很简单:

123456789101112 from voluptuous import Schema s = Schema({    \’q\’: str,    \’per_page\’: int,    \’page\’: int}) print s({\”q\”: \”hello\”,          \”page\”: 10,         \”per_page\”: 20        })

这里可以看到,我们使用客户端传递过来的参数作为参数,调用了我们使用既定模板创建的对象,然后直接把他打印出来,如果你跑过这段代码,你会发现结果如下:

1234 {\”q\”: \”hello\”, \”page\”: 10, \”per_page\”: 20}

没错, voluptuous 就是将校验通过的参数返回了。就是这么简单。

那这时,你可能要问了,如果校验不通过的参数怎么办,我要怎么处理,下面就演示一下如果传递的参数是:

1234 {\”q\”: \”hello\”, \”page\”: \”world\”, \”per_page\”: 20}

这样的话,要怎么来处理校验不通过的问题,其实,当校验不通过的时候,Schema 会抛出一个异常,然后我们可以通过捕获这个异常来确定校验失败的问题,例如:

1234 try:    print s({\”q\”: \”hello\”, \”page\”: \”world\”\”per_page\”: 20})except MultipleInvalid as e:    print \”error: {} occur while parse args\”.format(e.errors)

当你执行这段代码之后,你会发现打印出来的内容是:

1 error: [TypeInvalid(\’expected int\’,)] occur while parse args

我们就知道参数是有问题的,需要客户端确认。

更进一 ͥ

ok,这就是一个简单的校验,下面我们进行更复杂的校验,我们现在不仅要保证参数的类型正确,我们还需要保证查询参数一定要有,另外两个参数可有可无。那么我们可以怎么做呢?

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...