【问题标题】:ceberus: How to ignore a field based on yaml comment?cerberus:如何忽略基于 yaml 注释的字段?
【发布时间】:2018-09-26 13:09:36
【问题描述】:

概述

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

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

示例

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

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

我该怎么做?

【问题讨论】:

  • 显然很有趣的问题。你能提供一个小例子来说明你的意思吗?
  • 例如:- ip_lan: X.X.X.X location: XXX model: EdgeSwitch name: SW-XX-XXX offset: [-1, -1] parents: PTP-XX-XXX-REM 假设位置字段是必需的。这个文件是 X.yaml 每个客户端都有一个 X.yaml。位置字段是必需的,2 个客户除外。所以我需要一种方法来设置不需要的位置,只编辑 .yaml 文件,而不是我的程序或我的 cerberus 架构。
  • 如果您在验证模式中设置了location,并且不允许以任何方式修改验证模式,那么您将陷入困境。如果允许您对验证模式进行轻微修改,那么有一个简单的解决方案。为什么不能修改验证架构?
  • @dreftymac 并不是我不能编辑我的架构,只是通常location 字段是必需的,但有时不是,这取决于我正在验证的 .yml 文件.就像我有a.ymlb.ymlc.yml,在a.ymlb.yml location 是必需的,但在c.yml 不是。所有 .yml 文件的架构都是相同的,但仅对于某些文件 location 不是必需的。所以我需要一种方法来告诉 cerberus:嘿,不要将此字段标记为必填项,即使 schema 这么说。
  • 好的,你能举一个需求条件的例子吗?比如location不需要model == CiscoXYZ或者什么?你想用什么作为触发器让 Cerberus 知道不需要位置?

标签: python validation yaml cerberus


【解决方案1】:

快速解答 (TL;DR)

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

详细解答

上下文

  • python 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的依赖。

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2017-02-28
    • 2022-09-24
    • 1970-01-01
    • 2017-01-06
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多