python表单验证库的建议

sat*_*oru 37 python validation formencode toscawidgets wtforms

我想要一个表单验证库

1.从表单验证中生成单独的html;

2.验证错误可以很容易地序列化,例如.作为json对象转储

你会在python web项目中选择什么形式的验证库?

Y.H*_*ong 43

放弃

一般来说,我现在对HTML表单库有点警惕.如果你使用大型框架中的东西,你总是必须引入整个巨型框架作为你的依赖.

许多巨型框架的许多子组件声称不依赖于框架,但我们不要自欺欺人.如果你不使用它,我至少知道有十几个表单库,它们在功能上有很多不同之处.仅仅是选择就会让人感到困惑.一般来说,正如Ian Bicking多年前所说并且仍然如此,我认为一个适合每个人的形式库的概念是非常荒谬的.事实上,我认为你可能需要三思而后才决定你真的需要一个.您可能只需要FormEncode等表单验证库.这真的取决于你想如何使用它.

对我来说,由于我没有使用超级框架,我会选择轻量级,易于拾取和配置的东西,以及不妨碍正常使用HTML/JS/CSS的东西.

结束免责声明

我试过ToscaWidgets,ToscaWidgets 2,Formish,变形,WTForms和FormEncode.我不得不说它们都不是完美的.这是我与他们的经历:

  • ToscaWidgets,ToscaWidgets 2 - 非常强大,但也非常复杂.ToscaWidgets 2要好得多,但它仍然是alpha自动取款机.它需要相当多的忍者技能来设置,并且当您需要自定义默认模板时,您的代码会很快膨胀.
  • Formish/Deform - 几乎和TW一样强大,但Formish现在处于休眠状态.它也与Mako紧密相连,所以如果你不使用Mako,它可能不适合你.Deform是Formish的重写,但它带来了大量的Zope依赖.在支持除ZPT之外的其他模板语言方面,变色龙还不太完善.这两个库也不是特别容易设置.
  • WTForm - 非常简单,不会妨碍你,它在开发方面非常活跃.它远不如上面的库那么强大,但它通常会处理你可能遇到的80%的用例,所以它已经足够好了.
  • FormEncode - 自2005年以来尝试过.它经过充分测试,配备了最多的预建验证器,支持条件验证,以及数十种语言的有用错误信息.它还具有非常简单但集中的能力,可以在HTML中生成预填充值和错误消息的表单代码.它的缺点包括偶尔不直观的API和类似spagetti的内部代码.然而,这个库是非常可靠的,非常适合所有数据验证用例,它是我经常回来的那个.

截至2012年底,一个快速的谷歌和PyPI搜索Python验证库回来了数百个包.有一些值得注意的,折扣那些正在积极开发的Django扩展.似乎有一种趋势是使用JSON-Schema定义模式,并且能够通用地验证Python数据结构.这可能反映了服务器应用程序开发人员从多个渠道(RESTful API和HTML表单)接受用户数据,但仍然只想使用一个验证库.

鉴于Python 3.3的发布可能会引发大规模的移植现有库以支持Python 3.x(另一方面是看到旧库停滞并且仅与Python 2.x保持兼容),这可能是明智之举选择一个已经支持或正在积极支持Python 3.x.

最后,选择表单验证库时另一个值得关注的重点是能够报告有用的错误消息,从长远来看,总是需要对错误消息进行本地化.提供自己的错误消息的难易程度将很快确定将库与其他Web应用程序体系结构集成的复杂性.

有前途的后起之秀:


Mar*_*nas 12

我可能会选择WTForms.


Jos*_*hua 1

这取决于天气,然后取决于您使用什么类型的框架。

对于您的任务,我建议您使用web2py-Framework,它易于使用并且仍然“强大”。它默认具有表单验证功能web2py-book是免费的),这正是您想要的:它将 html 生成与验证分开并自动执行此操作,但如果您愿意,您可以自定义它。

一个例子:

def display_form():
    form=FORM('Your name:',
              INPUT(_name='name', requires=IS_NOT_EMPTY()),
              INPUT(_type='submit'))
    if form.accepts(request.vars, session):
        response.flash = 'form accepted'
    elif form.errors:
        response.flash = 'form has errors'
    else:
        response.flash = 'please fill the form'
    return dict(form=form)
Run Code Online (Sandbox Code Playgroud)

也可以序列化错误,但对于这些问题,最好在web2py-group上询问。他们非常友善并且会很快为您提供帮助。

希望能帮助到你!此致..

  • +1 为 web2py 吸吮。全球环境和隐含的一切都使一切变得更加困难,尤其是测试。这就像用 Python 编写 PHP,但更糟糕的是,因为你总是忘记它不是真正的 Python。 (2认同)