Пользовательская аутентификация входа в 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
неправильные. это не вызывает никакой ошибки.
какой самый распространенный способ обработки пользовательского входа в систему с помощью электронной почты.
- Я думаю, что причина того, что он не перенаправляет, заключается в том, что вы присвоили переменную
request.GET.get("next")
в переменнуюnxt
, однако вы проверяете переменнуюnext
на перенаправление, возможно, вам следует изменить переменнуюnxt
наnext
. - Причина, по которой не возникает ошибка, заключается в том, что вы поместили
try and except
для обработки выброшенных ошибок в методauthenticate()
, и вы просто поместилиpass
в частьexcpetion
. Если вы хотите, чтобы ошибка не выбрасывалась, просто удалите частьtry and except
изauthenticate()
.