pylons:验证模型层的数据

时间:2010-11-03 21:54:19

标签: model pylons validation

我正在评估一些Web应用程序框架,最后,两个最大的竞争者(在我看来)是Ruby on Rails和Pylons。为了更好地理解这两个框架而不花费太多时间,我决定在一个框架上遵循一个非平凡的应用程序教程,并尝试在另一个框架上重复相同的事情。我希望这次演习能突出明显的差异。

对于我的实验,我选择了Ruby on Rails Tutorial。我已经在Rails中完成了应用程序,现在,我已经开始在Pylons中完成它了。我已经达到了第6章而没有太多的戏剧性(鉴于这一点大部分都是静态页面,这并不奇怪)。现在,我需要为用户实现模型,并将验证逻辑添加到模型中。第一部分是直截了当的,但我被困在第二部分。

从我看来,Pylons采用在表单级别实现验证的方法。做了一些研究,我看到很多人建议您接受表单输入的点是输入验证的正确位置。我还在github上经历了很多pylons项目,但我还没有找到一个处理模型级数据验证的项目。我见过的最接近的是开发人员将他们的表单与模型层中的数据一起存储,但在我看来这是作弊。我不介意不遵循教程中的信和跟随人群,但我碰巧同意教程。对于相关模型,验证在正确的位置完成:检查密码长度,用户名长度,并验证电子邮件实际上是电子邮件,所有感觉都是模型级别约束。另外,如果我将至少有两个表单将数据添加到此模型(创建新用户,并修改信息),并以两种不同的形式重复相同的验证听起来不对。

简而言之(为TLDR突出显示):我是否可以使用基础架构将表单与模型绑定比建议的SQLAlchemy / formencode对更紧密? With这两个,我能做的最好的是在模型层添加断言。实际上,这不是真的,我可以尝试用自定义代码弥补差距,但它确实看起来像很多代码,并且很难做到正确。所以,我认为在尝试扩展我不太了解的代码之前先询问一下会更好。

2 个答案:

答案 0 :(得分:2)

首先,我不知道任何内置方式。在表单级别进行验证是有意义的,因为不同的表单/视图可能访问相同的模型,需要根据当前用户,情况(基于时间)等执行不同的验证。所以我是其中一个正在进行验证的部分控制器级别的东西。

现在关于它的大量代码,我认为您可以轻松地创建formencode方案作为SqlAlchemy(SA)模型的一部分,然后只需挂钩到事件中的对象save()并运行那里的验证模式。或者编写一个包装函数,用于在执行保存之前填充初始对象。所以而不是:

person = Session.Query(People).get(10)
person.fname = request.params['fname']
person.lname = request.params['lname']

你会做更多的事情:

person = Session.Query(People).get(10)
person.populate(request.params)

它将迭代对象中的参数和列来设置它,沿途进行验证。

很抱歉,这不是你想要的,但希望这有助于你找到一个体面的中间地带。

答案 1 :(得分:1)

当您使用class + mapper方法时,SQLAlchemy会为您提供一些basic validation decorators。该基础设施是否足以满足您的需求?

另外,回应Rick,请记住,对于给定的表,您的应用程序可能不必始终遵循相同的验证规则。