Django request.user вообще не использует пользовательский бэкенд

Я работаю с пользовательской моделью пользователя и пользовательским бэкендом в Django 5.0 для входа в систему с помощью электронной почты. Вот бэкенд :

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        print("authenticate called")
        try:
            user = User.objects.get(email=username)
        except User.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

    def get_user(self, user_id):
        try:
            print(user_id)
            print("get_user called")
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

Он правильно зарегистрирован в AUTHENTICATION_BACKENDS, а в модели пользователя есть только поле email.

Бэкэнд отлично работает в моем представлении регистра, используя authenticate(request, username=email, password=password), и login(request, user) тоже работает.

Однако, если в другом представлении после входа в систему я попытаюсь использовать request.user, оно всегда будет возвращать AnonymousUser. Если же я делаю request.session.values, то идентификатор пользователя правильный.

Я не могу найти никого, у кого была бы такая же проблема в Интернете, поэтому я надеюсь, что кто-то может помочь мне устранить неполадки.

Я пытался использовать request.user с пользовательским бэкендом, но он никогда не вызывается. Я также попытался использовать request.session.values, и на этот раз идентификатор пользователя был правильным. Предполагалось, что request.user должен возвращать текущего пользователя с моей пользовательской моделью, но он всегда возвращает AnonymousUser

За кулисами Django поддерживает list "бэкенды аутентификации", которые он проверяет на подлинность. Когда происходит вызов authenticate(), Django пытается пройти аутентификацию через все свои бэкенды аутентификации в этом list.

Если первый метод аутентификации не работает, Django пробует второй, и так далее, пока не будут испробованы все бэкенды. Но если один из них окажется успешным, Django не будет продолжать.

This means that the order of specifying “authentication backends” is important. Your custom “authentication backend” should be added to the list of AUTHENTICATION_BACKENDS [django-docs] in settings.

AUTHENTICATION_BACKENDS = [
    'python path.to.EmailBackend',
    'django.contrib.auth.backends.ModelBackend'
]
Вернуться на верх