Подтвердить что ты не робот

Простая проверка данных

Я пишу модуль python, который будет содержать некоторые функции, которые будут манипулировать базой данных mongodb.

Как я могу выполнить проверку входных данных, переданных этой функции, прежде чем сохранять их в базе данных?

Например, скажем, одна из функций в модуле createUser(user), которая принимает словарь python в качестве аргумента. Этот словарь содержит информацию о пользователе для сохранения в базе данных. Я хочу создать автоматическую процедуру проверки, которая проверяет соответствие структуры словаря структуре базы данных.

4b9b3361

Ответ 1

Я выпустил "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')

Запустив проверку с предыдущими определенными правилами, мы получим 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.']
}