7

我正在使用 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

4 回答 4

3

当您保存用户时,它不会自动激活。请检查AnonymousUser的链接,该链接说明您的用户如何成为AnonymousUser

因此,您必须将所有可能使您的用户设置为AnonymousUser. 验证前请检查user.is_anonymous()

于 2012-02-15T07:57:02.667 回答
0

当用户未通过身份验证时会发生这种情况。确保您使用相同的字段来登录后端...例如,我正在使用电子邮件登录(使用电子邮件和密码的后端)所以

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

如果对我来说

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

后端在这里: http: //www.micahcarrick.com/django-email-authentication.html

于 2014-10-04T03:28:24.643 回答
0

有同样的问题。但问题是用户名太长并且被截断为 30 个字符。在这里找到了答案:

Django 注册表单“AnonymousUser”对象没有属性“后端”

于 2012-03-08T16:51:21.357 回答
0

如果您在数据库中使用复制并且在写入主/默认数据库时碰巧从只读副本读取,那么如果存在复制滞后也可能导致这种情况。您将写入主服务器,而身份验证将尝试从只读副本读取,导致找不到用户。

解决方案是将您的路由器设置为使用默认数据库进行用户查询。

于 2016-02-11T20:01:08.707 回答