我刚开始在我的一个项目中使用Pyramid,我有一个案例,我需要验证表单字段输入,通过获取表单字段值并进行Web服务调用来断言价值的正确性。例如,有一个名为银行CUSTOMER-ID的字段。我需要将(单独)作为输入并通过进行Web服务调用(如http://someotherdomain/validate_customer_id/?customer_id=<input_value>
)在服务器级别进行验证。
我使用Colander进行表单架构管理,使用Deform进行所有表单验证逻辑。我很困惑我需要在CUSTOMER-ID案例中放置验证逻辑。它是MySchema().bind(customer_id=<input_value>)
(它有一个查询web服务的延迟验证器)或者form.validate(request.POST.items())?如果我采用延迟验证器的路径,则MySchema().bind
会因错误的CUSTOMER-ID而引发colander.Invalid
错误。没关系。但是,该错误不是在表单级别,而是在模式级别。那么我该如何以理智的方式告诉用户呢?
我对Django表单有很好的经验,所以我期待像clean
方法这样的东西。像form ['customer_id']这样的表单错误。错误是我在模板级别所期待的。 Pyramid的Deform还是Colander有可能吗?
答案 0 :(得分:8)
所以我认为你遇到的最大问题是理解Colander和Deform的关注点分离。漏勺是人们喜欢称之为通用模式验证库的东西。这意味着我们定义了一个模式,其中每个节点都有一个特定的数据类型,一些节点可能是必需的/可选的。然后,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数据。另一方面,Deform是一个表单库,可以帮助您创建/验证表单。它使用漏勺来满足所有验证需求,as you can see它几乎完全将验证委托给漏勺。因此,要回答您的问题,您可以在漏勺中完成所有验证工作,而变形主要用于处理表单的渲染。
答案 1 :(得分:2)
要查看生动的金字塔示例应用并执行变形,请将todopyramid视为IndyPy Python Web Shootout的一部分。在金字塔,django,烧瓶和瓶子中实施了todo应用。我研究了金字塔示例 - 编写得很好,显示了变形模式验证并使用bootstrap来显示验证消息。
查找更多金字塔教程here: