Django App Engine: AttributeError: 'AnonymousUser' 对象没有 'backend' 属性

7 投票
4 回答
11946 浏览
提问于 2025-04-17 13:04

我在使用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 个回答

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

1

我也遇到过同样的问题。不过问题出在用户名太长了,系统把它截断成了30个字符。我在这里找到了答案:

Django注册表单 'AnonymousUser' 对象没有 'backend' 属性

3

当你保存用户的时候,它不会自动激活。请查看这个链接,了解AnonymousUser,里面讲了用户是如何变成AnonymousUser的。

所以你需要设置所有可能导致用户变成AnonymousUser的选项。在进行身份验证之前,请检查一下user.is_anonymous()

撰写回答