【问题标题】:Django App Engine: AttributeError: 'AnonymousUser' object has no attribute 'backend'Django App Engine:AttributeError:'AnonymousUser'对象没有属性'backend'
【发布时间】:2012-03-06 13:25:02
【问题描述】:

我正在使用 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。谁能证实这是真的?如果有,如何解决?

【问题讨论】:

  • 请通过回溯过去原来的错误。

标签: python django google-app-engine django-nonrel djangoappengine


【解决方案1】:

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

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

【讨论】:

  • 我不这么认为。正如您在上面的代码中看到的那样,我在尝试登录之前创建了用户并对其进行了身份验证。它不应该是匿名用户。
  • 是的,但请查看is_anonymous()。创建用户时,它不会自动active,因此请确保is_anonymous() 将返回Falseis_authenticated() 必须返回True
【解决方案2】:

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

Django Register Form 'AnonymousUser' object has no attribute 'backend'

【讨论】:

  • 这绝对不是。用户名不是那么长。
【解决方案3】:

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

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

如果对我来说

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2020-10-13
      • 2019-10-21
      • 2017-05-27
      相关资源
      最近更新 更多