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, то это может привести к задержке репликации. Вы будете писать мастеру, а аутентификация будет пытаться читать из реплики чтения, в результате чего пользователь не будет найден.
Решение состоит в том, чтобы настроить маршрутизаторы на использование базы данных по умолчанию для пользовательских запросов.