a data validator like Django ORM
Project description
python-validator
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
细心的同学可能发现了 IntegerField
不接受 “数字字符串”,上面的例子中 age
是一个 IntegerField
,形如 '24'
这样的值是非法的。在某些情况下,你可能希望 IntegerField
不要这么严格,'24'
这样的值也是可以接受的,那么可以把 strict
选项设为 False
,如:age = IntegerField(min_value=1, max_value=120, default=20, strict=False)
。当 strict
选项为 False
时,python-validator 会尝试进行类型转换,假如转换失败则会报错。
接下来你可以 查看进阶 了解 python-validator 更多的用法,查看字段 API 了解字段的详细信息。
测试
使用 tox 和 pytest 进行代码测试。
推荐使用 pipenv 来管理项目依赖。
假如使用 pipenv:
-
pipenv install
(安装依赖库) -
pipenv run test
假如使用 pip:
-
pip install -r requirements.txt
(安装依赖库) -
tox
其它
如果遇到 BUG 或者有任何建议,欢迎提交 issue 或者 PR。
如果希望贡献代码,请尽量编写测试用例并测试你的代码,然后再提交 PR。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file python-validator-0.0.8.tar.gz
.
File metadata
- Download URL: python-validator-0.0.8.tar.gz
- Upload date:
- Size: 17.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.4 CPython/3.9.1 Linux/4.19.167-1-MANJARO
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e9b7e3d58aaa50b4ae2564e1b2c7f3356e7eb3cf7712bff0bd6a6583856696cf |
|
MD5 | 9fb2a077f60b0fcbd26686e04f6b428b |
|
BLAKE2b-256 | ddc937b8e27e2dd84e765a4065653a54e8385f22b88876645793e049d8a27fbf |
File details
Details for the file python_validator-0.0.8-py3-none-any.whl
.
File metadata
- Download URL: python_validator-0.0.8-py3-none-any.whl
- Upload date:
- Size: 18.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.4 CPython/3.9.1 Linux/4.19.167-1-MANJARO
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4df0cd1b20487a389a830cff0335279850326fe1a8ad03e2cee1c7579f922d14 |
|
MD5 | 24e3e8ec2d93d4aac45c8cfd514f97ba |
|
BLAKE2b-256 | 7103db685a411259bef8eee0d0c3c6e41c1380abee0d9c79a9b229ea8263534d |