Аутентификация в формах? - PullRequest
0 голосов
/ 06 ноября 2011

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

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

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, прежде чем я узнаю API форм.

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

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

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

1 Ответ

1 голос
/ 06 ноября 2011

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

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")

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

...