web-dev-qa-db-ja.com

シンプルなデータ検証

私は、mongodbデータベースを操作するいくつかの関数を含むpythonモジュールを作成しています。

データベースに保存する前に、その関数に渡された入力データを検証するにはどうすればよいですか?

たとえば、モジュールの関数の1つがcreateUser(user)であるとします。これは、python辞書を引数として受け入れます。この辞書には、データベースに保存するユーザー情報が含まれています。辞書構造がデータベース構造と一致することをチェックする自動検証ルーチンを作成します。

23
anujkk

「pyvaru」( https://github.com/daveoncode/pyvar )を数日前にリリースしました。これは、Python 3(3.4+)、検証ルールの概念に基づいています。

ドキュメントからの引用:

以下のような既存のモデルを検証します(ただし、pyvaruはデータ形式を想定していないため、単純な辞書または任意のデータ構造になる可能性があります)。

class User:
    def __init__(self, first_name: str, last_name: str, date_of_birth: datetime, sex: str):
        self.first_name = first_name
        self.last_name = last_name
        self.date_of_birth = date_of_birth
        self.sex = sex

Get_rules()メソッドを実装することでバリデーターを定義する必要があり、検証するフィールドごとに1つ以上の適切なルールを提供する必要があります。

from pyvaru import Validator
from pyvaru.rules import TypeRule, FullStringRule, ChoiceRule, PastDateRule

class UserValidator(Validator):
    def get_rules(self) -> list:
        user = self.data # type: User
        return [
            TypeRule(apply_to=user,
                     label='User',
                     valid_type=User,
                     error_message='User must be an instance of user model.',
                     stop_if_invalid=True),
            FullStringRule(user.first_name, 'First name'),
            FullStringRule(user.last_name, 'Last name'),
            ChoiceRule(user.sex, 'Sex', choices=('M', 'F')),
            PastDateRule(user.date_of_birth, 'Date of birth')
        ]

最後に、カスタムバリデーターの使用方法に関して2つの選択肢があります。

コンテキストプロセッサとして:

with UserValidator(user):
    # do whatever you want with your valid model

この場合、with内のコードは検証が成功した場合にのみ実行されます。それ以外の場合は、ValidationException(適切なレポートを含むvalidation_resultプロパティを含む)が発生します。

Validate()メソッドを呼び出す(ValidationResultを返す)

validation = UserValidator(user).validate()
if validation.is_successful():
    # do whatever you want with your valid model
else:
    # you can take a proper action and access validation.errors
    # in order to provide a useful message to the application user,
    # write logs or whatever

以下のように構成されたユーザーのインスタンスがあると仮定します。

user = User(first_name=' ',
            last_name=None,
            date_of_birth=datetime(2020, 1, 1),
            sex='unknown')

以前に定義されたルールを使用して検証を実行すると、次のエラーを含むValidationResultが取得されます。

{
    'First name': ['String is empty.'],
    'Last name': ['Not a string.'],
    'Sex': ['Value not found in available choices.'],
    'Date of birth': ['Not a past date.']
}
4
daveoncode