mongodb データベースを操作するいくつかの関数を含む python モジュールを作成しています。
データベースに保存する前に、その関数に渡された入力データを検証するにはどうすればよいですか?
たとえば、モジュール内の関数の 1 つがcreateUser(user)、Python 辞書を引数として受け入れるとします。このディクショナリには、データベースに保存するユーザー情報が含まれています。辞書構造がデータベース構造と一致することを確認する自動検証ルーチンを作成したいと考えています。
mongodb データベースを操作するいくつかの関数を含む python モジュールを作成しています。
データベースに保存する前に、その関数に渡された入力データを検証するにはどうすればよいですか?
たとえば、モジュール内の関数の 1 つがcreateUser(user)、Python 辞書を引数として受け入れるとします。このディクショナリには、データベースに保存するユーザー情報が含まれています。辞書構造がデータベース構造と一致することを確認する自動検証ルーチンを作成したいと考えています。
数日前に"pyvaru" ( https://github.com/daveoncode/pyvaru ) をリリースしました。これは、検証ルールの概念に基づいた、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 = sexget_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 = 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.'] }