Pythonのバリデーションライブラリ「Cerberus」のよく使うバリデーションルールをまとめてみた

2019.08.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

CX事業本部の佐藤です。現在携わっている案件では、PythonのバリデーションライブラリのCerberusを導入しています。今回は、実際の開発でよく使うであろうバリデーションをまとめてみました。

Cerberusとは

Pythonのオープンソースのバリデーションライブラリです。pythonの dictlist の各属性に対してのバリデーションを簡単に行うことができます。

リポジトリは以下です。

https://github.com/pyeve/cerberus

ドキュメントは以下です。

https://docs.python-cerberus.org/en/stable/index.html

基本的な使い方

以下は、型のバリデーションのサンプルです。

v = Validator({'name': {'type': 'string'}})
v.validate({'name': 'john doe'}) # True
v.validate({'name': 1}) # False

実際によく使うバリデーション

個人的によく使いそうだなと思われるバリデーションをまとめてみました。

type

型のバリデーション行います。

string

v = Validator({'name': {'type': 'string'}})
v.validate({'name': 'hoge'}) # True
v.validate({'name': 1}) # False

integer

v = Validator({'id': {'type': 'integer'}})
v.validate({'id': 1}) # True
v.validate({'id': 'hoge'}) # False

boolean

v = Validator({'is_hoge': {'type': 'boolean'}})
v.validate({'is_hoge': True}) # True
v.validate({'is_hoge': 'hoge'}) # False

dict

schema = {
  'info': {
    'type': 'dict',
    'schema': {
      'id': {
        'type': 'integer'
      },
      'value': {
        'type': 'string'
      }
    }
  }
}
v = Validator(schema)
v.validate({'info': {'id': 1, 'value': 'hoge'} }) # True
v.validate({'hoge': {'id': 1, 'value': 'hoge'} }) # False
v.validate({'info': {'id': 1, 'hoge': 'hoge'} }) # False

required

必須属性をバリデーションします。

schema = {
    'id': {
        'type': 'integer', 
        'required': True
    }, 
    'value': {
        'type': 'string', 
        'required': False 
    } 
}
v = Validator(schema)
v.validate({'id': 1, 'value': 'hoge'}) # True
v.validate({'id': 1 }) # True
v.validate({'value': 'hoge'}) # False

allowed

キーバリューとして、許可する値をバリデーションします。

schema = {
  'value': {
    'type': 'string',
      'allowed': ['hoge', 'fuga']
  }
}
v = Validator(schema)
v.validate({'value': 'hoge'}) # True
v.validate({'value': 'fuga'}) # True
v.validate({'value': 'piyo'}) # False

dependencies

ある属性に依存する場合のバリデーションを行います。

以下では、 hoge , fuga 属性が存在するときのみ piyo が有効になるバリデーションです。

schema = {
  'hoge': {'required': False},
  'fuga': {'required': False},
  'piyo': {'required': False, 'dependencies': ['hoge', 'fuga']}
}
v = Validator(schema)
v.validate({'hoge': 'hoge'}) # True
v.validate({'fuga': 'fuga'}) # True
v.validate({'piyo': 'piyo'}) # False
v.validate({'hoge': 'hoge', 'piyo': 'piyo'}) # False
v.validate({'hoge': 'hoge', 'fuga': 'fuga', 'piyo': 'piyo'}) # True

empty

空白のバリデーションを行います。

schema = {
  'hoge': {
    'type': 'string',
    'empty': False
  }
}
v = Validator(schema)
v.validate({'hoge': ''}) # False

min, max

typeが integer, float , number の場合に、最小値、最大値のバリデーションを行います。

schema = {
  'hoge': {
    'type': 'integer',
    'min': 0,
    'max': 100
  }
}
v = Validator(schema)
v.validate({'hoge': 1}) # True
v.validate({'hoge': 100}) # True
v.validate({'hoge': -1}) # False
v.validate({'hoge': 101}) # False

minlength, maxlength

typeが string の場合に、最小文字数、最大文字数のバリデーションを行います。

schema = {
  'hoge': {
    'type': 'string',
    'minlength': 2,
    'maxlength': 10
  }
}
v = Validator(schema)
v.validate({'hoge': 'hoge'}) # True
v.validate({'hoge': 'h'}) # False
v.validate({'hoge': 'hogehogehoge'}) # False

nullable

値がNoneを許可するかどうかのバリデーションを行います。

schema = {
  'hoge': {
    'type': 'string',
    'nullable': True
  },
  'fuga': {
    'type': 'string',
    'nullable': False
  }
}
v = Validator(schema)
v.validate({'hoge': 'hoge'}) # True
v.validate({'hoge': None}) # True
v.validate({'fuga': None}) # False

まとめ

よく使いそうなバリデーションをまとめてみました。他にも、便利な組込バリデーションルールや、自分でカスタムバリデーションを作成することもできます。