哪一个是表单验证的正确方法?Colander的Schema验证或Deform的表单验证?

Non*_*-da 2 forms validation pyramid deform colander

我刚刚开始在我的一个项目中使用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())?如果我采用延迟验证器的路径,则会因错误的CUSTOMER-ID MySchema().bind而引发colander.Invalid错误.没关系.但是,该错误不是在表单级别,而是在模式级别.那么我该如何以理智的方式告诉用户这个呢?

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

Jay*_*D3e 8

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

request.POST = {
    'post_id': 1,
    'author_id': 1,
    'unnecessary_attr': 'stuff'
}
Run Code Online (Sandbox Code Playgroud)

我可以这样验证它:

# schema
schema = SchemaNode(Mapping(),
                    SchemaNode(Integer(), name='post_id'),
                    SchemaNode(Integer(), name='author_id'))
schema.deserialize(request.POST)
Run Code Online (Sandbox Code Playgroud)

如果它无法使数据符合指定的模式,则会出错.所以你可以看到,漏勺实际上可以用于验证任何数据集,无论是来自POST/GET/JSON数据.另一方面,Deform是一个表单库,可以帮助您创建/验证表单.它使用漏勺来满足所有验证需求,正如您所看到的那样,它几乎完全将验证委托给漏勺.因此,要回答您的问题,您可以在漏勺中完成所有验证工作,而变形主要用于处理表单的渲染.

  • 谢谢.现在很清楚.但是,如果架构验证失败,我将如何报告表单错误?就像告诉用户"输入的CUSTOMER_ID无效"一样?因为他们处于两个不同的层次. (2认同)