Python极简主义数据验证器xdata如何使用?
XData
Github: https://github.com/gaojiuli/xdata
一款非常实用的数据验证工具, 通常用于请求数据的验证.
Features
- 验证数据一步到位
- 容易扩展,容易自定义数据类型以及验证方式
- 无第三方依赖
Required
- python >= 3.5
Installation
pip install xdata
Usage
ValidatedData
from xdata import *
class UserSchema(Schema):
telephone = Str(length=11, required=True)
password = Str(min_length=8,max_length=16, required=True)
request_data = {
‘telephone’:‘18180050000’,
‘password’:‘idonotknow’
}
schema = UserSchema(request_data)
if schema.valid:
print(schema.validated_data) # {‘telephone’: ‘18180050000’, ‘password’: ‘idonotknow’}
Errors
from xdata import *
class UserSchema(Schema):
telephone = Str(length=11, required=True)
password = Str(min_length=8, max_length=16, required=True)
request_data = {}
schema = UserSchema(request_data)
if not schema.valid:
print(schema.errors) # {‘telephone’: ‘telephone is required’, ‘password’: ‘password is required’}
DataTypes
from xdata import *
DataType(required=True,default=‘11’,choices=[])
Str(length=11, max_length=12,min_length=10,regex="")
Int(max=10000,min=12)
Bool(max=10000,min=12)
Decimal(left=5,right=2)
DateTime(max_datetime=‘2001-01-01 00:00:00’, min_datetime=‘2000-01-01 00:00:00’)
Date(max_date=‘2001-01-01’, min_date=‘2000-01-01’)
Time(max_time=‘06:00:00’, min_time=‘05:00:00’)
Test
coverage run --source=xdata -m pytest && coverage report
Github: https://github.com/gaojiuli/xdata
欢迎有兴趣的朋友一起参与进来
Python极简主义数据验证器xdata如何使用?
没人有兴趣?
xdata是一个轻量级的数据验证库,核心是通过装饰器来定义和验证数据模型。下面是一个完整的使用示例:
from xdata import DataModel, types
# 1. 定义数据模型
class User(DataModel):
name: types.String(min_length=1, max_length=50)
age: types.Integer(min_value=0, max_value=150)
email: types.Email()
is_active: types.Boolean(default=True)
# 2. 创建实例并自动验证
user = User(
name="张三",
age=25,
email="zhangsan@example.com"
)
print(user.name) # 输出: 张三
# 3. 验证失败会抛出异常
try:
invalid_user = User(name="", age=200, email="invalid-email")
except ValueError as e:
print(f"验证失败: {e}")
# 4. 数据转换示例
class Product(DataModel):
price: types.Float(min_value=0.0)
tags: types.List(item_type=types.String())
product = Product(price=29.99, tags=["电子", "数码"])
print(product.tags) # 输出: ['电子', '数码']
# 5. 嵌套模型
class Address(DataModel):
city: types.String()
street: types.String()
class Company(DataModel):
name: types.String()
address: Address
company = Company(
name="ABC公司",
address={"city": "北京", "street": "中关村大街"}
)
print(company.address.city) # 输出: 北京
主要用法就这些:继承DataModel、用类型注解定义字段、直接实例化就会自动验证。字段类型都在xdata.types里,像String、Integer、Email这些都有内置验证规则。
一句话总结:用类定义结构,实例化时自动验证。
这个特别像 https://github.com/schematics/schematics ,有什么不同之处吗?
作用似乎是一样的
楼主的项目都是 x 开头啊,之前在 reddit 还看过关于 xweb 的讨论
我这个只用于数据验证,思路和 schematics 不一样。我是要大家能够很容易实现扩展,很容易自定义自己的数据结构。只做验证一件事的
谢谢你的回复。我这么取名字原因是想不到名字可以取了! x 开头感觉比较酷吧
感觉在 web 上使用场景有限, http 传递过来的参数都是 string ,而楼主的 Int(DataType)判断直接是 isinstance(value, int),这样用户传递过来的参数不可能有 int 值了。 django wsgi 对参数 encode(默认 utf-8)了一下。 django 的 form 的 IntegerField ,做法是 try:int(str(value));except TypeError, ValueError:raise…;
不过这个问题不大!我是把你的这个理解成了 django 的 form ,不知道对不对!
xdata 用于请求数据的过滤验证过程, 首先从请求中取得数据(可能是 json,form-data 等)转为 dict 这个过程应该交给 web 框架处理, 此时所有的数据类型就符合请求者的想法了, 然后 xdata 再验证这个 dict 数据是否合法.
#8 http 的 query_string 应该都是 string 类型吧
query_string 解析为 dict 时的数据转换应该交给 web 框架来做
wtforms 针对的是网页 form 的验证,提供了生成 form 的功能,核心都是为网页服务的.我做这个是想做一个纯粹的数据验证工具. xdata 与 wtforms 比起来,用法要简单一些.
嗯
楼主都在做些有趣的东西,先关注下


