Аутентификация в формах?

#django #django-forms #django-authentication

#django #django-формы #django-аутентификация

Вопрос:

Должен ли я писать логику аутентификации в своих формах для обработки входа пользователя?

Например, я хотел бы отображать сообщения пользователю, если учетная запись еще не активирована. Для этого я сейчас делаю что-то вроде этого (ужасно, я знаю):

 def login(request):
    email = request.POST.get('email')
    password = request.POST.get('password')

    user = auth.authenticate(email=email, password=password)

    if user is not None:
        if user.is_active:
            auth.login(request, user)
            # etc
        else:
            # send "not activated message"
    else:
        # send "not found message"
  

Это намного уродливее, чем в реализации, но я избавлю Интернет от моей первоначальной попытки обработки форм в Django до того, как я изучил forms API.

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

Есть ли какие-либо недостатки в этом?

PS: Я знаю, что Django поставляется с видом входа в систему и целыми девятью ярдами, но у меня есть конкретные потребности проекта, в которых мне нужно немного подправить аутентификацию и т.д., Поэтому, пожалуйста, не предлагайте «использовать включенный вид», на этот раз я не могу.

Ответ №1:

Как вы писали, вы можете создать форму входа, в которую вы можете добавить метод очистки:

 class LoginForm(forms.Form):
    email = ...
    password = ...

    def clean(self):
        user = User.objects.filter(email=self.email)
        if not user.exists():
            raise forms.ValidationError("User does not exists")
        if not user.is_active:
            raise forms.ValidationError("This account is not active")
  

Это хороший способ решения этой проблемы.

Комментарии:

1. Вы правы, хотя выполнение аутентификации дважды кажется довольно странным.