2010-11-03 72 views
3

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

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

从我看到的,Pylons采取在窗体级别上实现验证的方法。做了一些研究,我看到很多人认为接受表单输入的地方是输入验证的正确位置。我也经历了很多github上的挂架项目,并且我一直无法找到处理模型级数据验证的单个项目。我见过的最接近的地方是开发人员将他们的表单与模型图层中的数据一起存储,但我认为这是欺骗行为。我不介意不按照教程来跟随人群,但我碰巧赞同教程。对于有问题的模型,验证在正确的位置完成:检查密码长度,用户名长度以及验证电子邮件实际上是电子邮件都被认为是模型级限制。此外,如果我至少有两种将数据添加到此模型(创建新用户,修改信息)的表单,并且以两种不同形式重复相同的验证听起来不太合适。

为了长话短说(突出显示TLDR):有没有我可以使用的基础结构,它比建议的SQLAlchemy/formencode对更紧密地将表单绑定到模型上?有了这两个,我能做的最好的就是在模型层添加断言。实际上,这不是事实,我可以尝试用自定义代码弥合差距,但它确实看起来像很多代码,很难正确。所以,我认为在尝试扩展我不太了解的代码之前先问问一下最好。

回答

2

所以首先,我不知道任何内置的方式。表单级别的验证是有意义的,因为不同的表单/视图可能会访问相同的模型,并且需要根据当前用户,情况(基于时间)等进行不同的验证。所以我是那些正在进行验证的人员之一控制器级别的东西。我认为你可以很容易地创建formencode方案作为你的SqlAlchemy(SA)模型的一部分,然后钩入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) 

,它会通过PARAMS和列的对象迭代来设置它,一路上做验证。

对不起,没有你在找什么,但希望这可以帮助你找到一个体面的中间地带。

+0

该解决方案必须处理两件事:检测验证错误,并通过表单回报。所以我需要实现一些在表单和模型字段之间创建绑定的东西,并在模型验证器中为表单字段添加错误消息,并防止模型被保存。我仍然认为咀嚼初学者有点过分。 :) – vhallac 2010-11-04 08:31:12

+0

我决定只继续表单验证。完成应用程序后,我会重新讨论这个问题,如果我得到可用的东西,我会发布一个答案。在此之前,这看起来很有希望,所以我将其标记为答案。 – vhallac 2010-11-08 10:08:06

1

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

此外,回应里克,请记住,您的应用程序可能不必遵循关于给定表的所有时间相同的验证规则。

+0

我已经看到并试用了模型上的验证器。如果我去DIY的话,那种支持就是我正在考虑实施模型级验证。至于表单验证是必要的,我同意有些情况下对模型的验证没有意义 - 他们需要去控制器/表单。但也有一些情况下将它放在模型上是有意义的(就像这个特定的实例一样),我只是想看看是否有一种简单的方法来做到这一点。 – vhallac 2010-11-04 08:25:03

+0

这很有道理。不幸的是,我认为验证装饰器和你现在使用SA的形状一样好。祝你好运与DIY。 – 2010-11-04 19:55:40