xdata: Python 极简主义数据验证器

2017-03-24 15:08:35 +08:00
 prasanta

XData

Github: https://github.com/gaojiuli/xdata

一款非常实用的数据验证工具, 通常用于请求数据的验证.

Features

Required

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

欢迎有兴趣的朋友一起参与进来

2675 次点击
所在节点    Python
17 条回复
prasanta
2017-03-25 10:00:15 +08:00
没人有兴趣?
guyskk
2017-03-25 19:28:17 +08:00
这个特别像 https://github.com/schematics/schematics ,有什么不同之处吗?
laike9m
2017-03-26 10:34:52 +08:00
@guyskk 作用似乎是一样的
laike9m
2017-03-26 10:37:03 +08:00
楼主的项目都是 x 开头啊,之前在 reddit 还看过关于 xweb 的讨论
prasanta
2017-03-26 10:50:30 +08:00
@guyskk 我这个只用于数据验证,思路和 schematics 不一样。我是要大家能够很容易实现扩展,很容易自定义自己的数据结构。只做验证一件事的
prasanta
2017-03-26 10:53:04 +08:00
@laike9m 谢谢你的回复。我这么取名字原因是想不到名字可以取了! x 开头感觉比较酷吧
EchoUtopia
2017-03-27 16:14:32 +08:00
感觉在 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 ,不知道对不对!
prasanta
2017-03-27 16:25:40 +08:00
@EchoUtopia xdata 用于请求数据的过滤验证过程, 首先从请求中取得数据(可能是 json,form-data 等)转为 dict 这个过程应该交给 web 框架处理, 此时所有的数据类型就符合请求者的想法了, 然后 xdata 再验证这个 dict 数据是否合法.
EchoUtopia
2017-03-27 16:34:24 +08:00
@prasanta #8 http 的 query_string 应该都是 string 类型吧
prasanta
2017-03-27 22:50:37 +08:00
@EchoUtopia query_string 解析为 dict 时的数据转换应该交给 web 框架来做
siteshen
2017-03-28 00:50:21 +08:00
最近写 API 在用 WTForm 比较多,一些对比:
1. __init__ 参数全是 (*args, **kwargs) 要看源码才知道怎么用, API 不友好;
2. 别人家的都是 String , Integer 到这里却简称了;
3. 别人家的都是提供 validators ,这里只提供一个 fn ,调用者需要负责合并,还要写清楚什么时候执行下一步验证;
4. 整篇代码都在使用 self.name 却没见一个赋值(别说 self.name = None )。
prasanta
2017-03-28 11:09:41 +08:00
@siteshen

1. README 已经是所有的用法.(*args, **kwargs)是因为参数可变,有代码的提示的 ide 会提示所有需要的参数.
2. 简称只是一种约定而已, 自定义数据类型是很容易的.
3. fn 是自定义的验证器,在很多情况下是不会用到的, 稍微复杂的验证应该自定义数据类型.
4. self.name 实现 schema 初始化的是否赋值.用途时命名验证器.

`self.checkers[k].name = k` line 34 in schema.py
gwind
2017-03-28 11:22:51 +08:00
wtforms
prasanta
2017-03-28 11:37:33 +08:00
@gwind

wtforms 针对的是网页 form 的验证,提供了生成 form 的功能,核心都是为网页服务的.我做这个是想做一个纯粹的数据验证工具. xdata 与 wtforms 比起来,用法要简单一些.
gwind
2017-03-28 14:33:06 +08:00
@prasanta 是的,我们开发 API 时,简单定制过 wtforms ,不需要其生产表单功能
prasanta
2017-03-28 15:41:19 +08:00
@gwind
cocoakekeyu
2017-04-04 14:59:04 +08:00
楼主都在做些有趣的东西,先关注下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350053

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX