2012-09-02 72 views
22

我正在写一个python模块,它将包含一些将操纵mongodb数据库的函数。简单数据验证

如何在将数据保存到数据库之前验证传递给该函数的输入数据?

例如,假设模块中的一个函数是createUser(user),它接受一个Python字典作为参数。该字典包含用于保存在数据库中的用户信息。我想创建一个自动化验证例程,检查字典结构是否匹配数据库结构。

+0

我对此并不十分熟悉,但我认为您可能想要使用ORM(请参阅http://stackoverflow.com/questions/2781682/mongodb-orm-for-python) - 尽管您会失去NoSQL DB的灵活性。 –

+0

谢谢。我知道使用ORM的可能性,但在这种情况下,我想直接操作MongoDB数据库。 – anujkk

+2

https://github.com/nicolaiarocci/cerberus/。我喜欢性感但现在更喜欢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()方法 和我们想验证我们必须提供一个或多个 适当的规则(一个或多个)的每个字段。

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') 
     ] 

最后,我们必须了解如何使用我们的自定义的验证两种选择:

由于上下文处理器:

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

在这种情况下,代码里面有只当 执行验证成功,否则引发一个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') 

通过运行与确认先前定义的规则我们将获得 a 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.'] 
}