2

我看到很多应用程序使用 Form 对象来验证数据,然后将数据传递给模型,而在模型中完全没有验证。我觉得最好将核心验证放在模型本身(例如,永远没有 18 岁以下的用户)以在任何情况下运行。换句话说,我不关心用户是如何创建的(无论是通过 web ui 还是命令行),核心规则应该始终适用。

我正在使用 SQLAlchemy(在 Pyramid 应用程序中),我想在模型中定义我的核心验证规则,使我的表单(WTForms)始终尊重模型中定义的核心规则,以便所有数据都是一致的。

其他人是否已经在这样做,或类似的事情?

类似于这个 php解决方案的东西。

4

1 回答 1

2

SQLAlchemy 允许您注册侦听器,这些侦听器在某些事件发生时被调用,例如您可以注册一个事件以在修改模型的字段时触发。来自SQLAlchemy 文档

当将 retval=True 标志传递给 listen() 时,侦听器可以选择返回值的可能修改版本:

def validate_phone(target, value, oldvalue, initiator):
    "Strip non-numeric characters from a phone number"

    return re.sub(r'(?![0-9])', '', value)

# setup listener on UserContact.phone attribute, instructing
# it to use the return value 
listen(UserContact.phone, 'set', validate_phone, retval=True)

像上面这样的验证函数也可以引发异常,例如ValueError停止操作。

因此,如您所见,您可以在模型级别修改或拒绝某些字段的值。

我不确定您的表单库是否与此功能集成,但推出您自己的解决方案绝对不会太难。

于 2012-06-30T21:31:09.607 回答