【问题标题】:Recommendation for python form validation library [closed]python表单验证库的推荐[关闭]
【发布时间】:2010-07-07 07:36:52
【问题描述】:

我想要一个表单验证库

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

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

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

【问题讨论】:

  • 这个问题是在 2 年前提出和回答的,你们说的“可能”发生的“征求辩论、争论、投票或扩展讨论”都没有。也许有点过分热心?

标签: python validation formencode wtforms toscawidgets


【解决方案1】:

免责声明

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

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

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

END免责声明

我已经尝试过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)

【讨论】:

  • Colander 一直在为我工作,仅供参考。
【解决方案2】:

我可能会选择WTForms

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      对于您的任务,我建议您使用web2py-Framework,它易于使用且仍然“强大”。它有form-validation by defaultweb2py-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 上提问。他们非常好,会很快为您提供帮助。

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

      【讨论】:

      • @Satoru.Logic 感谢 -1 的回答,我把时间花在......无论如何,解释一下“web2py 很烂”是什么意思?
      • >.session 就是这样一个变量,我没有看到任何简单的方法来更改另一个会话实现。 ..
      • @Satoru.Logic:不管这是否属实,你的评论没有任何价值
      • +1 用于 web2py 吸吮。全球环境和隐含的一切使一切变得更加困难,尤其是测试。这就像用 Python 编写 PHP,但更糟糕的是,因为你一直忘记它不是真正的 Python。
      • 我的意思是arround模型+控制器的所有东西都有一些魔力。真的。远离 PHP 领域的魔法。某些变量/对象在应用程序范围内时可能看起来好像是全局的。这些对象非常常见,以至于您几乎找不到不使用会话、数据库、请求等的应用程序。它们被记录在案。您知道整个注射过程并牢记这一点 - 相信我不会发生任何不好的事情。单元测试几乎在每个框架中都存在问题。由于您必须提供上下文/环境,因此您无法在不模拟请求和环境的情况下测试表单。
      【解决方案5】:

      这取决于你使用什么底层框架。

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

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

      并且tipfy 使用WTForms。

      django 的内置系统是迄今为止最好的。

      你在后台使用什么框架?

      【讨论】:

      • 谢谢。我目前正在使用 Django 的内置表单框架。只是想知道是否有其他我可以尝试的表单库。
      • 如果您有特殊需要,我建议您扩展内置框架,我已经尝试了很多但没有比 django 更好的了。
      猜你喜欢
      • 2010-09-06
      • 2015-07-23
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2011-06-01
      • 2010-09-21
      • 2013-08-12
      • 1970-01-01
      相关资源
      最近更新 更多