python表单验证库的建议

时间:2010-07-07 07:36:53

标签: python validation formencode wtforms toscawidgets

我想要一个表单验证库

1.从表单验证中分离出html生成;

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

您在python Web项目中选择哪种形式的验证库?

5 个答案:

答案 0 :(得分:43)

<强>声明

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

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

对我而言,由于我不使用大型框架,我会选择轻量级,易于拾取和配置的东西,以及不妨碍正常使用HTML /的方式JS / CSS。

END免责声明

我已尝试ToscaWidgetsToscaWidgets 2FormishDeformWTForms和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年底,一个快速的Google和PyPI搜索Python验证库带来了数百个软件包。有一些值得注意的,折扣那些正在积极开发的Django扩展。似乎有一种趋势是使用JSON-Schema定义模式并能够一般性地验证Python数据结构。这可能反映了服务器应用程序开发人员从多个渠道(RESTful API和HTML表单)接受用户数据,但仍然只想使用一个验证库。

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

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

有前途的后起之秀:

  • Voluptuous(非常受欢迎,非常简单的API)
  • Kanone(灵感来自FormEncode)
  • Schemadocopt的同一作者,非常简单的API)

答案 1 :(得分:12)

我可能会选择WTForms

答案 2 :(得分:4)

这个话题有点旧,但我想我会无耻地插入我为此目的而写的库。它并不是HTML表单所独有的,但至少部分地考虑了它们。

当我命名时,我感觉不是很有创意,所以“Validator”现在必须做。在这里:https://github.com/wilhelm-murdoch/Validator

答案 3 :(得分:1)

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

对于您的任务,我建议您使用web2py-Framework,它易于使用且仍然“强大”。它有form-validation by defaultweb2py-book是免费的),它完全符合您的要求:它从验证中分离出html生成并自动执行此操作,但如果您愿意,您可以自定义它。< / p>

一个例子:

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)

也可以序列化错误,但对于那些问题,最好在web2py-group上询问他们。他们非常好,会很快帮助你。

希望它有所帮助!最好的问候..

答案 4 :(得分:0)

这取决于您使用的底层框架。

对于django来说,内置于表单框架是最好的,

虽然kay使用zine表单系统的扩展版本

和tipfy使用WTForms。

到目前为止,django的内置系统是最好的。

你在幕后使用什么框架?