Я думаю, что «решил» свою проблему, по крайней мере, пока она функциональна.Я решил использовать свой собственный сервер аутентификации.Я создал файл 'auth_backends.py' и добавил его к AUTHENTICATION_BACKENDS в моих settings.py:
Мои поля формы входа содержат только «имя пользователя» и пароль.Единственный способ проверить, является ли введенное имя пользователя на самом деле его именем пользователя или адресом электронной почты, - это .find ('@').Есть ли лучший способ проверить это?Этого будет достаточно?Причина, по которой я это делаю, заключается в том, что пользователю легче запомнить свою электронную почту, чем имя пользователя (которое на самом деле представляет собой «идентификатор», состоящий из цифр).
Я также собираюсьпозаботиться о дублировании писем.
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User
class CustomUserModelBackend(ModelBackend):
def authenticate(self, **credentials):
if 'username' in credentials:
if credentials['username'].find('@') > 0:
return self.authenticate_by_email(**credentials)
else:
return self.authenticate_by_username(**credentials)
def authenticate_by_username(self, username=None, password=None):
try:
user = User.objects.get(username=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def authenticate_by_email(self, username=None, password=None):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None