1

概述

我有很多 .yaml 文件和验证它们的模式。有时,一个“不正确”的值实际上是正确的。

我需要一些方法来忽略某些字段。不应对这些字段执行任何验证。

例子

  ## file -- a.yaml
  some_dict:
      some_key: some_valid_value

  ## file -- b.yaml
  some_dict:
      some_key: some_INVALID_value # cerberus: ignore

我怎样才能做到这一点?

4

1 回答 1

0

快速回答 (TL;DR)

  • “复合验证”方法允许条件(上下文感知)验证规则。
  • pythoncerberus包支持“开箱即用”的复合验证。
  • YAML 注释不能用于复合验证,但 YAML 字段可以。

详细解答

语境

  • 蟒蛇2.7
  • cerberus 验证包

问题

  • 开发人员 PabloPajamasCreator 希望应用条件验证规则。
  • 条件验证规则会根据数据集中其他字段的存在或值被激活。
  • 条件验证规则需要足够灵活,以根据源数据中的任意状态或关系“即时”更改。

解决方案

  • 这种方法可以通过复合数据验证来完成。
  • 在这个用例下,复合验证仅仅意味着创建一个顺序的验证规则列表,例如:
    • 每个单独的规则都对复合数据变量进行操作
    • 每个单独的规则都指定了规则何时应用的“触发条件”
    • 每个单独的规则都会产生三个互斥验证结果之一:validation-successvalidation-failvalidation-skipped

例子

示例验证规则
- 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 格式表示。

基本原理

  • 这种方法可以扩展到任意复杂程度。
  • 这种方法很容易被人类理解(尽管 jmespath 语法可能是一个挑战)
  • 可以使用这种方法建立任意复杂的条件和约束集。

陷阱

  • 上面的例子使用 jmespath 语法来指定rule_vpath,它告诉系统什么时候触发特定的规则,这增加了对 jmespath 的依赖。

也可以看看

于 2019-03-21T17:46:37.870 回答