Django 应用引擎: AttributeError: 'AnonymousUser' 对象没有属性 'backend'

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。有人可以确认这是真的吗?如果是,该如何修复?


请粘贴原始错误及其回溯信息。 - Nilesh
4个回答

3
当您保存用户时,它不会自动激活。请查看链接AnonymousUser,其中说明了如何让您的用户成为AnonymousUser
因此,您必须设置可能使用户成为AnonymousUser的所有项目。在认证之前,请检查user.is_anonymous()

我不这么认为。如你所见,在上面的代码中,我在尝试登录之前创建并验证了用户。这不应该是匿名用户。 - speedplane
1
是的,但请检查 is_anonymous()。当您创建用户时,它不会自动变为“活动状态”,因此请确保 is_anonymous() 返回 False,并且 is_authenticated() 必须返回 True - Nilesh

0

这绝对不是它。用户名并不那么长。 - speedplane

0
如果您在数据库中使用复制,并且在写入主/默认数据库时从读副本中读取,那么如果存在复制延迟,也可能会导致此问题。您将写入主数据库,而身份验证将尝试从读副本中读取,结果找不到用户。
解决方案是设置路由器以使用默认数据库进行用户查询。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接