欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

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

发布时间:2024/7/23 python 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 python数据校验_最近抽空造了一个数据校验的轮子 Python -validator 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

最近抽空造了一个数据校验的轮子 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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。