2012-09-02 15 views
22

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

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

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

+0

私はこれにはあまり慣れていませんが、ORM(http://stackoverflow.com/questions/2781682/mongodb-orm-for-pythonを参照)を使用したいと思うかもしれませんが、 NoSQL DBの柔軟性。 –

+0

ありがとうございます。私はORMを使用する可能性について認識していますが、この場合はMongoDBデータベースを直接操作したいと思います。 – anujkk

+2

https://github.com/nicolaiarocci/cerberus/私は気晴らしが好きですが、今はケルベロスが好きです。すべてのルールは、気まぐれなライブラリや他のライブラリの呼び出し可能ファイルの必要性とは対照的に、人間が読めるyamlファイルで宣言することができます。 – chishaku

答えて

2

私は数日前に「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 = sex 

我々はget_rules()メソッド を実装することによって、我々は我々が一つ以上の 適切なルール(複数可)を提供する必要が検証するフィールドごとに、バリデータを定義する必要があります。 場合にのみ実行されると、コード内でこの場合

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

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

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つの選択肢がありますValidationExceptionが成功した場合は、ValidationException(適切なレポートとともに validation_resultプロパティを含む)が送出されます。検証とを実行することにより

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

:我々は以下として設定されたユーザのインス​​タンスを持っていると仮定すると(ValidationResultを返す)validate()メソッド

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 

を呼び出すことによって

前に定義されたルールでは、 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.'] 
} 
関連する問題