3

我刚刚开始在我的一个项目中使用Pyramid,我有一个案例,我需要验证表单字段输入,方法是获取该表单字段值并进行 Web 服务调用以断言该值的正确性。例如,有一个字段称为您银行的 CUSTOMER-ID。我需要将其(单独)作为输入,并通过进行 Web 服务调用(例如http://someotherdomain/validate_customer_id/?customer_id=<input_value>)在服务器级别进行验证让我们说。

我正在使用滤锅进行表单架构管理,并使用Deform进行所有表单验证逻辑。我很困惑我需要在哪里放置 CUSTOMER-ID 案例的验证逻辑。是在(它有一个查询网络服务的延迟验证器)还是在 form.validate(request.POST.items()) ?如果我采用延迟验证器的路径,则会因不正确的 CUSTOMER-ID引发错误。没关系。但是该错误不在表单级别,而是在架构级别。那么我该如何以理智的方式告诉用户呢?MySchema().bind(customer_id=<input_value>)MySchema().bindcolander.Invalid

我对 Django 表单有很好的经验,所以我期待类似clean方法的东西。像 form['customer_id'].error 这样的表单错误是我在模板级别所期望的。Pyramid's Deform 或 Colander 有可能吗?

4

2 回答 2

9

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

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 是一个表单库,可帮助您创建/验证表单。它使用滤锅来满足所有验证需求,正如您所看到的,它几乎完全将验证委托给滤锅。因此,要回答您的问题,您将在滤锅中完成所有验证工作,而变形将主要处理表单的呈现。

于 2014-01-07T08:06:09.607 回答
2

要查看生动的金字塔示例应用程序并实际变形,请查看作为 IndyPy Python Web Shootout 一部分todopyramid。在 pyramid、django、flask 和 bottle 中实现了一个 todo 应用程序。我研究了金字塔示例——它写得很好,显示了变形模式验证并使用引导程序显示验证消息。

在此处查找更多金字塔教程:

于 2014-01-07T16:13:24.847 回答