38

我想要一个表单验证库

1.将html生成与表单验证分开;

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

你会在 Python Web 项目中选择什么表单验证库?

4

5 回答 5

45

免责声明

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

许多大型框架的许多子组件声称不依赖于框架,但我们不要自欺欺人。如果您不使用其中一个,那么我所知道的至少有十几个表单库,它们的功能差异很大。仅是选择就会变得相当混乱。一般来说,正如 Ian Bicking 多年前所说并且仍然正确的那样,我认为适合每个人的表单库的概念是非常可笑的。事实上,我认为你可能需要三思而后行才能决定你真的需要一个。大多数情况下,您只需要像FormEncode这样的表单验证库。这真的取决于你想如何使用它。

对我来说,因为我不使用大型框架,所以我会选择轻量级、易于上手和配置以及不会妨碍正常使用 HTML/JS/CSS 的东西.

完 免责声明

我尝试过ToscaWidgetsToscaWidgets 2FormishDeformWTForms和 FormEncode。我不得不说它们都不是完美的。以下是我对他们的体验:

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

截至 2012 年底,对 Python 验证库的快速 Google 和 PyPI 搜索返回了数百个包。有十几个值得注意的,不包括那些正在积极开发的 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)
于 2011-05-11T06:55:51.583 回答
13

I'd probably pick WTForms.

于 2010-07-10T14:26:13.460 回答
4

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

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

于 2012-04-03T09:11:33.537 回答
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)

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

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

于 2010-07-07T12:23:13.210 回答
0

it depends on what underlying framework you use.

for django , built in form framework is best,

while kay uses extended version of zine's form system

and tipfy uses WTForms.

django's built in system is best so far .

what framework do you use under the hood ?

于 2010-07-10T14:31:34.697 回答