Django App Engine: AttributeError: у объекта 'AnonymousUser' нет атрибута 'backend'

Я использую djangoappengine. Когда я пытаюсь создать нового пользователя, аутентифицировать его и войти в систему, я получаю следующую ошибку AttributeError: 'AnonymousUser' object has no attribute 'backend',

Мой код прост и выглядит так:

user = User.objects.create_user(username, username, password)
user.set_password(password)
user.save()

user = django.contrib.auth.authenticate(username=username, password=password)
django.contrib.auth.login(request, user)

Я получаю только следующую ошибку на производстве и только изредка:

web req_create: 'AnonymousUser' object has no attribute 'backend'
Traceback (most recent call last):
  File "/base/data/home/apps/s~XXXXX/1.356802202883392818/XXXX/XXX.py", line 332, in req_create
    login(request, user)
  File "/base/data/home/apps/s~XXXXX/1.356802202883392818/django/contrib/auth/__init__.py", line 82, in login
    request.session[BACKEND_SESSION_KEY] = user.backend
AttributeError: 'AnonymousUser' object has no attribute 'backend'

Я не уверен, но у меня плохое предчувствие, что это исключение связано с высоким хранилищем данных репликации и его возможной согласованностью. я думаю что authenticate() сохраняет значение пользователя и login() выполняет запрос, но пользовательское значение еще не распространилось в HRDS. Кто-нибудь может подтвердить, что это правда? Если так, как это будет исправлено?

4 ответа

Когда вы сохраните пользователя, он не будет активирован автоматически. Пожалуйста, проверьте ссылку для AnonymousUser, которая говорит, как ваш пользователь стал AnonymousUser,

Таким образом, вы должны установить все элементы, которые могут быть сделаны вашим пользователем как AnonymousUser, Перед аутентификацией, пожалуйста, проверьте user.is_anonymous(),

Была такая же проблема. Но проблема была в том, что имя пользователя было длинным и было урезано до 30 символов. Нашел ответ здесь:

Объект формы регистрации Django 'AnonymousUser' не имеет атрибута 'backend'

Это происходит, когда пользователь не прошел аутентификацию. Убедитесь, что вы используете одно и то же поле для входа в Backend... например, я регистрируюсь по электронной почте (Backend, который использует электронную почту и пароль), поэтому

django.contrib.auth.authenticate(username=username, password=password)

если для меня

django.contrib.auth.authenticate(username=email, password=password)

Серверная часть находится здесь: http://www.micahcarrick.com/django-email-authentication.html

Если вы используете репликацию в своей базе данных и случайно читаете из реплики Read во время записи в базу данных master/default, то это может привести к задержке репликации. Вы будете писать мастеру, а аутентификация будет пытаться читать из реплики чтения, в результате чего пользователь не будет найден.

Решение состоит в том, чтобы настроить маршрутизаторы на использование базы данных по умолчанию для пользовательских запросов.

Другие вопросы по тегам