Уведомления

Группа в Telegram: @pythonsu

#1 Май 10, 2019 12:57:36

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

Как организовать валидатор формы?

подскажите пожалуйста как правильно организовать валидатор полей формы, который соответствовал бы принципу открытости закрытости. ниже привожу код моей попытки, но он плох потому, что при добавлении новых полей в форму, придётся менять уже существующий код(в частности метод check_registration)

 import re
class Validator:
    def __init__(self):
        self.password_min_length = 6
        self.username_max_length = 20
        self.regex_username = "^[A-Za-z0-9]*$"
        self.regex_email = "^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
    def check_registration(self, form):
        errors_username = self._errors_username(form['username'])
        errors_email = self._errors_email(form['email'])
        errors_passwords = self._errors_passwords(form['password1'], form['password2'])
        errors = []
        errors.extend(errors_username)
        errors.extend(errors_email)
        errors.extend(errors_passwords)
        return errors
    def _errors_email(self, email):
        if bool(re.search(self.regex_email, email)):
            return []
        else:
            return ['Введите корректный email']
    def _errors_username(self, username):
        errors = []
        if len(username) == 0:
            errors.append('Введите имя')
        if len(username) > self.username_max_length:
            errors.append('Имя слишком длинное')
        if not re.match(self.regex_username, username):
            errors.append('Имя содержит недопустимые символы')
        return errors
    def _errors_passwords(self, password1, password2):
        errors = []
        if len(password1) != len(password2):
            errors.append('Пароли не совпадают')
        if len(password1) == 0 and len(password2) == 0:
            errors.append('Пароли не введены')
        elif len(password1) < self.password_min_length or len(password2) < self.password_min_length:
            errors.append('Пароль слишком короткий')
        return errors

Как видите, мой валидатор работает следующим образом:
1. проверки конкретных полей находятся в приватных методах: _errors_email(), _errors_username(), _errors_passwords()
2. эти приватные методы поочерёдно вызываются из метода check_registration()
3. в результате, метод check_registration() для валидной формы возвращает пустой список, а для невалидной формы - список, заполненный сообщениями об ошибках

и вообще, стоит ли заморачиваться? я видел подобный подход в вполне серьёзных проектах. может, быть оставить всё как есть сейчас?

Отредактировано zlodiak (Май 10, 2019 13:00:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version