2

我正在验证.csv文件,我想以用户习惯的格式给出验证结果。为了使用Cerberus,我让用户在.yaml文件中定义验证规则。

架构.yaml

Rules:
 Rule1:
  maxlength: 10

 Rule2:
  allowed: ["MO", "TU", "WE", "TH", "FR", "SA", "SU"]

 Rule3:
  required: True

然后,我将这些规则映射到它们适用的 CSV 文件中的列。

csv_fields.yaml

Fields:
 1:
  rules:
   - Rule1
   - Rule2

 2:
  rules:
   - Rule2
   - Rule3

 3:
  rules:
   - Rule1
   - Rule3

样本文件.csv

下面是一个包含三列的示例文件first_nameday_of_weekis_employed

Peter, XX, True

要使用 Cerberus 进行验证,请将文档键中的rules定义与文件中的 交叉引用。这很容易做到,因为文件在 python 中以键值格式读取为字典。rulescsv_fields.yamlRulesschema.yaml.yaml

我的问题

在上面的示例数据中,cerberus 抛出了错误'day_of_week': ['unallowed value XX'],但用户不知道是什么规则触发了这个错误。

期待告诉用户的是,错误是由用户知道的而不是技术 Cerberus 特定定义unallowed value XX触发的。Rule2Rule2

即使这意味着定义schema.yaml不同,有没有办法实现这一点?

我查看了Cerberus 错误部分,但似乎找不到解决方法。

更新:

所以我尝试在schema.yamlmeta的规则定义中添加一个字段

Rules:
 Rule1:
  maxlength: 10
  meta: {'rule_name': "Rule1"}

但是当我测试时,我似乎无法从引发的错误中访问这个元密钥,因为我在document_error_tree甚至schema_error_tree.

4

1 回答 1

5

我和你在同一个地方,我会告诉你我做了什么。

创建了一个自定义的 error_handler 并在错误消息前面加上人类可读的键。

from cerberus.errors import BasicErrorHandler

class CustomErrorHandler(BasicErrorHandler):
        def __init__(self, schema):
            self.custom_defined_schema = schema

        def _format_message(self, field, error):
            return self.custom_defined_schema[field].get('meta', {}).get('rule_name', field) + ': ' + super(CustomErrorHandler, self)._format_message(field, error)

val = Validator(schema, error_handler=CustomErrorHandler(schema))

这是我做的,希望对你有用。

于 2019-07-09T10:10:10.410 回答