如何使用Cerberus返回自定义规则名称/错误代码?

时间:2019-07-08 13:57:12

标签: python validation cerberus

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

schema.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

sample_file.csv

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

Peter, XX, True

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

我的问题

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

期望告诉用户错误unallowed value XX是由Rule2触发的,因为用户知道Rule2,而不是Cerberus的技术定义。

即使意味着以不同的方式定义schema.yaml,是否有办法实现这一目标?

我看过Cerberus Errors Section,但似乎找不到解决方法。

更新

因此,我尝试在 schema.yaml

中的规则定义中添加meta字段
Rules:
 Rule1:
  maxlength: 10
  meta: {'rule_name': "Rule1"}

但是当我测试时,由于在document_error_tree甚至schema_error_tree中找不到它,因此似乎无法从引发的错误中访问此元密钥。

1 个答案:

答案 0 :(得分:1)

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

创建了一个自定义的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))

这就是我所做的,希望对您有用。