最近抽空造了一个数据校验的轮子 python-validator。

在开发 web 应用时,经常需要校验前端传入的数据。如果使用 Django,那么可以使用自带的 forms 进行数据校验。

python-validator 的灵感也是来源于 Django 的 forms (类似 ORM 的方式定义数据结构),不过 python-validator 更加纯粹,只是数据校验,另外也支持使用 dict 定义数据结构,相比于使用类更加方便。

欢迎大家提建议。觉得不错麻烦给个 star 吧!

下面是简单的介绍:

python-validator 是一个类似于 Django ORM 的数据校验库,适用与任何需要进行数据校验的应用,比较常见的是 Web 后端校验前端的输入数据。

特性

支持 python2 和 python3。

使用类描述数据结构,数据字段一目了然。另外也支持使用字典定义数据结构。

可以自动生成用于测试的 mocking data。

可以打印出清晰的数据结构。

易于扩展。

依赖

six

IPy

pytz[可选,DatetimeField 的 tzinfo 参数需要一个 tzinfo 对象]

安装

pip install python-validator

快速入门

假设现在正在开发一个上传用户信息的接口 POST /api/user/,用户信息如下:

name

string,必选。

age

integer,可选,默认 20。

sex

string, 'f'表示女, 'm'表示男。可选, 默认 None。

原始的、枯燥无味的、重复性劳动的数据校验代码可能是下面这样:

def user(request):

# data = json.loads(request.body)

data = {

'age': '24f',

'sex': 'f'

}

name = data.get('name')

age = data.get('age', 20)

sex = dage.get('sex')

if name is None or len(name) == 0:

return Response('必须提供 name', status=400)

try:

age = int(age)

except ValueError as e:

return Response('age 格式错误', status=400)

if sex is not None and sex not in ('f', 'm'):

return Response('sex 格式错误', status=400)

user_info = {

'name': name,

'age': age,

'sex': sex,

}

...

上面这段代码总的来说有几个问题:

枯燥无味和重复性代码,不断的取出数据,检查字段是否缺失,类型是否合法等等。

从数据校验的代码无法轻易看出用户信息的数据结构,即字段是什么类型的,是否可选,默认值是什么。

使用 python-validator 校验数据

首先定义一个 UserInfoValidator 类

# validators.py

from validator import Validator, StringField, IntegerField, EnumField

class UserInfoValidator(Validator):

name = StringField(max_length=50, required=True)

age = IntegerField(min_value=1, max_value=120, default=20)

sex = EnumField(choices=['f', 'm'])

接下来使用 UserInfoValidator 进行数据校验,

from .validators import UserInfoValidator

def user(request):

# data = json.loads(request.body)

data = {

'age': '24',

'sex': 'f'

}

v = UserInfoValidator(data)

if not v.is_valid():

return Response({'msg': v.str_errors, 'code': 400}, status=400)

user_info = v.validated_data

...

v.str_errors 是一个字段名 - 错误信息的 dict,例如:

{'age': 'got a wrong type: str, expect integer', 'name': 'Field is required'}

错误信息解释:

age 等于 "24",不是合法的 int 类型。

name 是必须提供的,且没有指定默认值。

v.validated_data 是校验后合法的数据,例如:

{'age': 24, 'name': u'Michael', 'sex': 'f'}

下面是一些错误数据的例子:

data: {'age': 24, 'name': 'abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc', 'sex': 'f'}

is_valid: False

errors: {'name': 'string is too long, max-lenght is 50'}

validated_data: None

data: {'age': 24, 'name': 'Michael', 'sex': 'c'}

is_valid: False

errors: {'sex': "'c' not in the choices"}

validated_data: None

python数据校验_最近抽空造了一个数据校验的轮子 Python -validator相关推荐

  1. 数据科学家数据分析师_站出来! 分析人员,数据科学家和其他所有人的领导和沟通技巧...

    数据科学家数据分析师 这一切如何发生? (How did this All Happen?) As I reflect on my life over the past few years, even ...

  2. python oop 继承_关于oop:使类数据在python中可继承的正确方法是什么?

    我是Python的新手,来自Perl领域. 我正在尝试确定关于类数据的存储和访问的最佳实践,以便它可以被子类继承并可能进行扩展.阅读Python 2.7文档(我确实使用2.6),深入研究Python和 ...

  3. python大数据平台_基于腾讯位置大数据平台的全球移动定位数据Python爬取与清洗...

    前不久投稿了一篇论文是以腾讯位置大数据为基础进行人口空间化研究的,但是还未见刊,见刊后会给大家分享下具体的研究方法. 首先打开腾讯位置大数据星云图链接:https://xingyun.map.qq.c ...

  4. python 生意参谋_如何爬取生意参谋数据?是不是违规操作?

    生意参谋是阿里巴巴为商家打造的一站式.个性化.可定制的商务决策体验平台.近期发现,有部分人员使用爬虫爬取生意参谋平台数据,影响商家的用户体验.到底是如何爬取生意参谋数据呢? 官方推荐淘宝.京东.拼多多 ...

  5. 数据科学家数据分析师_使您的分析师和数据科学家在数据处理方面保持一致

    数据科学家数据分析师 According to a recent survey conducted by Dimensional Research, only 50 percent of data a ...

  6. jquery数据折叠_通过位折叠缩小大数据

    jquery数据折叠 Sometimes your dataset is just too large, and you need a way to shrink it down to a reaso ...

  7. spss23出现数据消失_改善23亿人口健康数据的可视化

    spss23出现数据消失 District Health Information Software, or DHIS2, is one of the most important sources of ...

  8. mongodb数据可视化_使用MongoDB实时可视化开放数据

    mongodb数据可视化 Using Python to connect to Taiwan Government PM2.5 open data API, and schedule to updat ...

  9. python图像分类代码_医学图像 | 使用深度学习实现乳腺癌分类(附python演练)

    乳腺癌是全球第二常见的女性癌症.2012年,它占所有新癌症病例的12%,占所有女性癌症病例的25%. 当乳腺细胞生长失控时,乳腺癌就开始了.这些细胞通常形成一个肿瘤,通常可以在x光片上直接看到或感觉到 ...

最新文章

  1. 值得推荐的8个超强工具,让你万事无忧!
  2. 汉语(普通话)的音素对齐
  3. C语言32位数加一精简,一个简单的32位多任务操作系统的实现(1)
  4. linux下安装QQ(转载)
  5. 基于Boost::beast模块的无栈协程http服务器
  6. linux视音频解码教程,音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)
  7. linux下 udf提权_mysql——udf提权
  8. 22岁何同学引爆B站!硬核毕设树莓派星轨拍摄仪,上演理工男的终极浪漫
  9. 项目助理这个工作怎么样_分析微信清理僵尸粉这个项目怎么样?
  10. 新编计算机应用基础项目教程电子书,计算机应用基础新编教程-殷锋社.pdf
  11. 微信公众平台开发(150)——从新浪云SAE上传图片到图文消息
  12. 如何在几天时间内快速理解一个陌生行业?
  13. Go语言核心36讲(Go语言实战与应用十九)--学习笔记
  14. Python爬虫入门案例
  15. jdk8 下载 安装 配置及idea配置jdk环境
  16. 论文中参考文献规范格式
  17. DS18B20温度传感器c语言编程,单片机中使用DS18B20温度传感器C语言程序(参考7)(DS18B20 测...
  18. 表情识别论文《OAENet Oriented Attention Ensemble for Accurate FacialExpression Recognition》中文翻译
  19. 国产手机后台弹出界面检测方法
  20. 笔记本电脑怎么打不开计算机,笔记本电脑打不开了怎么办

热门文章

  1. 完全理解Android中的RemoteViews
  2. mysql双机热备实现
  3. pppcloud云主机内LINUX用户安全管理2
  4. 404页面自动跳转javascript
  5. 初探数位DP-hdu2089
  6. 学习OpenStack之 (4): Linux 磁盘、分区、挂载、逻辑卷管理 (Logical Volume Manager)
  7. Kneser猜想与相关推广
  8. Mac eclipse找不到source的解决办法
  9. Unity(四):使用场景Ⅰ:建立类型映射
  10. 动态生成lookup字段