Django - Логин с электронной почтой или именем пользователя не работает - PullRequest
1 голос
/ 16 февраля 2020

В моем проекте я реализую систему входа в систему, где пользователь может войти в систему, используя свое имя пользователя или свою электронную почту. Я в основном пытаюсь выяснить, вставлена ​​ли электронная почта пользователя в поле формы «usernameOrEmail» или это имя пользователя введено в поле «usernameOrEmail». Затем я регистрирую их, если пользователь найден.

Вот мой код:

def login(request):
    context = {}
    if request.method == "POST":
        isFound = ""
        form = LoginForm(request.POST)
        if form.is_valid():
            try:
                user = User.objects.get(username=form.cleaned_data.get("usernameOrEmail"))
                isFound = "usernameFound"
            except User.DoesNotExist:
                try:
                    user = User.objects.get(email=form.cleaned_data.get("usernameOrEmail"))
                    isFound = "emailFound"
                except User.DoesNotExist:
                    isFound = "nothingFound"




            if isFound == "usernameFound":
                print("USERNAME FOUND!")
                user = auth.authenticate(username=form.cleaned_data.get("usernameOrEmail"), password=form.cleaned_data.get("password"))
                if user is not None:
                    auth.login(request, user)
                    return redirect('home')
                else:
                    context["error"] = "Oops, username/email or password provided is invalid"
            elif isFound == "emailFound":
                print("EMAIL FOUND")
                user = auth.authenticate(email=form.cleaned_data.get("usernameOrEmail"), password=form.cleaned_data.get("password"))
                if user is not None:
                    print("YES")
                    auth.login(request, user)
                    return redirect('home')
                else:
                    print("NO")
                    context["error"] = "Oops, username/email or password provided is invalid"
            else:
                context["error"] = "Oops, username/email or password provided is invalid"
        else:
            context["error"] = "Please enter valid form data"
    else:
        form = LoginForm()

Странно, терминал возвращает оператор печати "EMAIL FOUND", означающий, что электронная почта пользователя был найден, однако оператор печати «НЕТ» также печатается, и в шаблоне возвращается сообщение «Упс, имя пользователя / адрес электронной почты или пароль неверен».

Другая странная вещь заключается в том, что эта система работает для имени пользователя user, то есть когда я ввожу имя пользователя user в поле «usernameOrEmail» и ввожу правильный пароль, пользователь входит в систему. Кто-нибудь знает проблему? спасибо.

1 Ответ

1 голос
/ 16 февраля 2020

Стандартный сервер аутентификации работает только с username и password. Действительно, метод authenticate [GitHub] из ModelBackend реализован как:

    def authenticate(self, request, <b>username=None</b>, password=None, **kwargs):
        if username is None:
            username = kwargs.get(UserModel.USERNAME_FIELD)
        if username is None or password is None:
            return
        try:
            user = UserModel._default_manager.get_by_natural_key(username)
        except UserModel.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a nonexistent user (#20760).
            UserModel().set_password(password)
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

Это, однако, не является проблемой. Вы можете просто реализовать это с помощью:

def login(request):
    context = {}
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            try:
                user = User.objects.get(username=form.cleaned_data['usernameOrEmail'])
            except User.DoesNotExist:
                try:
                    user = User.objects.get(email=form.cleaned_data['usernameOrEmail'])
                except User.DoesNotExist:
                    user = None
            if user is not None:
                user = auth.authenticate(username=<b>user.username</b>, password=form.cleaned_data['password'])
            if user is not None:
                auth.login(request, user)
                return redirect('home')
            else:
                context['error'] = 'Oops, username/email or password provided is invalid'
        else:
            context['error'] = 'Please enter valid form data'
    else:
        form = LoginForm()
    # &hellip;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...