Cerberus
已经多次讨论了依赖于其他字段值的条件要求。的使用dependencies
不满足需求,因为字段可以unknown
在满足条件时使用。建议使用 of oneof
,但是当满足多个条件和依赖项时,它可能很难工作。现在通用的解决方案是什么?
问问题
540 次
1 回答
0
快速回答 (TL;DR)
- “复合验证”方法允许条件(上下文感知)验证规则。
- python
cerberus
包支持“开箱即用”的复合验证。 - 复合验证允许在触发条件上具有高度灵活粒度的易于人类阅读的规则。
详细解答
语境
- 蟒蛇2.7
- cerberus 验证包
问题
- 开发者 JasperHuangCreator 希望将触发条件应用于微调的验证规则。
解决方案
- 这种方法可以通过复合数据验证来完成。
- 在这个用例下,复合验证仅仅意味着创建一个顺序的验证规则列表,例如:
- 每个单独的规则都对复合数据变量进行操作
- 每个单独的规则都指定了规则何时应用的“触发条件”
- 每个单独的规则都会产生三个互斥验证结果之一:
validation-success
、validation-fail
或validation-skipped
例子
样本文件aadocuments = []
aadocuments.append(yaml.safe_load('''
person_fname: homer
person_lname: himpson
person_age: 33
prize_caption: free beer for life
prize_email: prizes@abcbooze.com
prize_category: alchohol
'''))
aadocuments.append(yaml.safe_load('''
person_fname: helen
person_lname: himpson
person_age: 16
prize_caption: free ammo for life
prize_email: prizes@zzzguns.com
prize_category: firearms
'''))
示例验证规则
- rule_caption: check-required-fields
rule_vpath: "@"
validation_schema:
person_fname:
type: string
required: true
person_lname:
type: string
required: true
person_age:
type: string
required: true
- rule_caption: check-age-range
rule_vpath: '@|@.person_age'
validation_schema:
person_age:
"min": 2
"max": 120
- rule_caption: check-underage-minor
rule_vpath: '[@]|[? @.person_age < `18`]'
validation_schema:
prize_category:
type: string
allowed: ['pets','toys','candy']
prize_email:
type: string
regex: '[\w]+@.*'
- 上面的代码是多个验证规则的 YAML 格式表示。
- 上面的代码通过使用
rule_vpath
名称-值对来指定触发条件。
基本原理
- 这种方法可以扩展到任意复杂程度。
- 这种方法很容易被人类理解(尽管 jmespath 语法起初可能是一个挑战)。
- 可以使用这种方法建立任意复杂的条件和约束集。
陷阱
- 上面的例子使用 jmespath 语法来指定
rule_vpath
,它告诉系统什么时候触发特定的规则,这增加了对 jmespath 的依赖。
也可以看看
于 2019-03-21T18:03:11.310 回答