Пользовательская аутентификация входа в Django через электронную почту

Я пытаюсь понять методы входа в Django. Так как я хочу входить в систему с помощью электронной почты, а не имени пользователя. Я написал собственный бэкенд аутентификации и раскрыл его в settings.py

AUTHENTICATION_BACKENDS = (
  'accounts.backend.EmailAuthenticationBackend',
  'django.contrib.auth.backends.ModelBackend',
)

class EmailAuthenticationBackend(ModelBackend):
  def authenticate(self, request, email=None, password=None, **kwargs):
    try:
      user = Account.objects.get(email=email)
      if user.check_password(password):
        return user
    except user.DoesNotExist:
      pass

И в представлении user_login как я аутентифицирую пользователя. И это действительно работает. Я имею в виду что-то вроде...

def user_login(request):
  next = request.GET.get("next")

  form = UserLoginForm(request.POST or None)
  if form.is_valid():
    email = form.cleaned_data.get("email")
    password = form.cleaned_data.get("password")
    user = authenticate(email=email, password=password)
    login(request, user)
    if next:
      return redirect(next)

    return redirect("/")

  context = {
    "form": form
  }

  return render(request, "accounts/user_login.html", context)

метод authenticate() возвращает пользователя. Но redirect() не работает, потому что браузер считает, что пользователь не вошел в систему. Я не уверен, как обрабатывать часть сессии.

и пользовательские UserLoginForm

class UserLoginForm(forms.Form):
  email = forms.CharField()
  password = forms.CharField()

  def clean(self, *args, **kwargs):
    email = self.cleaned_data.get("email")
    password = self.cleaned_data.get("password")

    if email and password:
      user = authenticate(email=email, password=password)
      if not user:
        raise forms.ValidationError("user not exist")

      if not user.check_password(password):
        raise forms.ValidationError("incorrect password")

    return super(UserLoginForm, self).clean(*args, **kwargs)

Вторая проблема заключается в том, что если email или password неправильные. это не вызывает никакой ошибки.

какой самый распространенный способ обработки пользовательского входа в систему с помощью электронной почты.

  1. Я думаю, что причина того, что он не перенаправляет, заключается в том, что вы присвоили переменную request.GET.get("next") в переменную nxt, однако вы проверяете переменную next на перенаправление, возможно, вам следует изменить переменную nxt на next.
  2. Причина, по которой не возникает ошибка, заключается в том, что вы поместили try and except для обработки выброшенных ошибок в метод authenticate(), и вы просто поместили pass в часть excpetion. Если вы хотите, чтобы ошибка не выбрасывалась, просто удалите часть try and except из authenticate().
Вернуться на верх