V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
prasanta
V2EX  ›  Python

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

  •  
  •   prasanta · 2017-03-24 15:08:35 +08:00 · 2674 次点击
    这是一个创建于 2792 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

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

    17 条回复    2017-04-04 14:59:04 +08:00
    prasanta
        1
    prasanta  
    OP
       2017-03-25 10:00:15 +08:00 via Android
    没人有兴趣?
    guyskk
        2
    guyskk  
       2017-03-25 19:28:17 +08:00
    这个特别像 https://github.com/schematics/schematics ,有什么不同之处吗?
    laike9m
        3
    laike9m  
       2017-03-26 10:34:52 +08:00
    @guyskk 作用似乎是一样的
    laike9m
        4
    laike9m  
       2017-03-26 10:37:03 +08:00
    楼主的项目都是 x 开头啊,之前在 reddit 还看过关于 xweb 的讨论
    prasanta
        5
    prasanta  
    OP
       2017-03-26 10:50:30 +08:00 via Android
    @guyskk 我这个只用于数据验证,思路和 schematics 不一样。我是要大家能够很容易实现扩展,很容易自定义自己的数据结构。只做验证一件事的
    prasanta
        6
    prasanta  
    OP
       2017-03-26 10:53:04 +08:00 via Android
    @laike9m 谢谢你的回复。我这么取名字原因是想不到名字可以取了! x 开头感觉比较酷吧
    EchoUtopia
        7
    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
        8
    prasanta  
    OP
       2017-03-27 16:25:40 +08:00
    @EchoUtopia xdata 用于请求数据的过滤验证过程, 首先从请求中取得数据(可能是 json,form-data 等)转为 dict 这个过程应该交给 web 框架处理, 此时所有的数据类型就符合请求者的想法了, 然后 xdata 再验证这个 dict 数据是否合法.
    EchoUtopia
        9
    EchoUtopia  
       2017-03-27 16:34:24 +08:00
    @prasanta #8 http 的 query_string 应该都是 string 类型吧
    prasanta
        10
    prasanta  
    OP
       2017-03-27 22:50:37 +08:00
    @EchoUtopia query_string 解析为 dict 时的数据转换应该交给 web 框架来做
    siteshen
        11
    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
        12
    prasanta  
    OP
       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
        13
    gwind  
       2017-03-28 11:22:51 +08:00
    wtforms
    prasanta
        14
    prasanta  
    OP
       2017-03-28 11:37:33 +08:00
    @gwind

    wtforms 针对的是网页 form 的验证,提供了生成 form 的功能,核心都是为网页服务的.我做这个是想做一个纯粹的数据验证工具. xdata 与 wtforms 比起来,用法要简单一些.
    gwind
        15
    gwind  
       2017-03-28 14:33:06 +08:00
    @prasanta 是的,我们开发 API 时,简单定制过 wtforms ,不需要其生产表单功能
    prasanta
        16
    prasanta  
    OP
       2017-03-28 15:41:19 +08:00
    @gwind
    cocoakekeyu
        17
    cocoakekeyu  
       2017-04-04 14:59:04 +08:00
    楼主都在做些有趣的东西,先关注下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3778 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:15 · PVG 12:15 · LAX 20:15 · JFK 23:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.