我如何使用 Cerberus return 自定义 rule-name/error-code?
How do I return a custom rule-name/error-code using 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_name
、day_of_week
和 is_employed
。
Peter, XX, True
为了使用 Cerberus 进行验证,我正在交叉引用 csv_fields.yaml
文档的 rules
键中定义的 rules
与 schema.yaml
中的 Rules
文件。这很容易做到,因为 .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
中找不到它。
我和你一样space,我会告诉你我做了什么。
创建了自定义 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))
这就是我做的,希望对你有用
正在验证 .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_name
、day_of_week
和 is_employed
。
Peter, XX, True
为了使用 Cerberus 进行验证,我正在交叉引用 csv_fields.yaml
文档的 rules
键中定义的 rules
与 schema.yaml
中的 Rules
文件。这很容易做到,因为 .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
中找不到它。
我和你一样space,我会告诉你我做了什么。
创建了自定义 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))
这就是我做的,希望对你有用