Cerberusでメールアドレスのバリデーションを行う

PythonスクリプトのバリデーションをCerberusで行うことにしたのはよいが、デフォルトでメールアドレスのチェックがない。

そこでCerberusに用意されている拡張方法を利用し、メールアドレスのチェックも行えるようにした。

Sample

結論、こうすればできた。

from cerberus import Validator
from email_validator import EmailNotValidError, validate_email


def is_email(field, value, error):
    try:
        validate_email(value, check_deliverability=False)
    except EmailNotValidError:
        error(field, "is not mail address.")


schema = {
    "name": {
        "type": "string",
        "required": True,
    },
    "email": {"type": "string", "required": True, "check_with": is_email},
    "title": {
        "type": "string",
        "required": True,
    },
    "message": {
        "type": "string",
        "required": True,
    },
}

request_body = {
    "name": "me",
    "email": "test@example.com",
    "title": "件名件名件名件名件名",
    "message": "メッセージメッセージメッセージメッセージメッセージ",
}


v = Validator(schema)
v.allow_unknown = True


# バリデーション実行
if not v.validate(request_body):
    # エラー理由
    print(v.errors)

print("Success")

Pythonのメールアドレスのチェックを検索すると正規表現を使う例が多くでたのだが、ライブラリがあるものはライブラリを使いたいのでemail_validatorを用いることにした。

Cerberusの拡張の仕方は、関数を使う方式で実施。Validatorを自分で継承して子クラスを造り、それで回す方法もあるようだが、なるべくプレーンなままのクラスを使いたかったため、このようにしている。

参考