2014-01-07 44 views
2

我刚开始对我的一个项目使用Pyramid,并且我需要通过获取表单字段值并进行Web服务调用以确认值的正确性,以验证表单域输入。例如,有一个字段叫做你的银行的CUSTOMER-ID。我需要将(单独)作为输入,并通过发出Web服务调用(如http://someotherdomain/validate_customer_id/?customer_id=<input_value>)让服务器级别进行验证。哪一个是表单验证的正确方法? Colander的Schema验证或Deform的表单验证?

我对表单模式管理使用Colander,对于所有表单验证逻辑使用Deform。我很困惑我需要在CUSTOMER-ID情况下放置我的验证逻辑。是否在MySchema().bind(customer_id=<input_value>)(它有一个延迟验证器查询Web服务)或者form.validate(request.POST.items())?如果我采用延迟验证程序的路径,则MySchema().bind对于错误的CUSTOMER-ID正在引发colander.Invalid错误。没关系。但是这个错误并不在表单层面,而是在模式层面。那么我怎么会以一种理智的方式告诉用户这件事?

我对Django窗体有很好的使用经验,所以我期待着像clean这样的方法。像表单['customer_id']。错误是我期望在模板级别。金字塔的Deform或Colander可能吗?

回答

8

所以我认为你遇到的最大问题是理解Colander和Deform关注的分离。 Colander是人们喜欢称之为通用模式验证库的东西。这意味着我们定义一个模式,其中每个节点都有一个特定的数据类型,并且一些节点可能是必需/可选的。然后,Colander能够验证该模式,并告诉我们我们传递给漏勺的数据是否符合该模式。举个例子,在我的网络应用程序中,我经常构建apis,接受需要验证的GET/POST参数。因此,在金字塔,让我们说我有这样的场景:

request.POST = { 
    'post_id': 1, 
    'author_id': 1, 
    'unnecessary_attr': 'stuff' 
} 

然后我就可以验证它就像这样:

# schema 
schema = SchemaNode(Mapping(), 
        SchemaNode(Integer(), name='post_id'), 
        SchemaNode(Integer(), name='author_id')) 
schema.deserialize(request.POST) 

如果它不能将数据符合指定的模式就会报错。所以你可以看到,漏勺实际上可以用来验证任何一组数据,无论是来自POST/GET/JSON数据。另一方面,变形是一个表单库,并可帮助您创建/验证表单。它使用漏勺满足所有的验证需求,并且它几乎完全委托验证漏勺。所以为了回答你的问题,你会用漏勺完成所有的验证工作,而变形将主要处理你的表单渲染。

+2

谢谢。现在很清楚。但是,如果模式验证失败,我将如何报告这种错误?就像告诉用户“输入无效的CUSTOMER_ID”一样?因为它们处于两个不同的层次。 –

+0

这是一个非常好的答案。 +1 –

+0

@漏洞在生态系统中,您想要更改的消息在验证器级别定义,即https://github.com/Pylons/colander/blob/master/colander/__init__.py#L314。当你实例化他们时,他们中的一些人接受“消息”kwarg,有些则不。 – JayD3e

2

要查看一个生动的金字塔示例应用程序和变形行为,请将todopyramid作为IndyPy Python Web Shootout的一部分。 todo应用程序在金字塔,Django,烧瓶和瓶子中实施。我研究了金字塔示例 - 写得很好,显示变形架构验证并使用引导来显示验证消息。

查找更多金字塔教程here