使用Twython Oauth的Django应用程序返回';匿名用户';对象没有属性';后端';

使用Twython Oauth的Django应用程序返回';匿名用户';对象没有属性';后端';,django,oauth,twitter-oauth,twython,Django,Oauth,Twitter Oauth,Twython,这里是Django高级初学者。我正把头撞在墙上想弄明白这件事。我有一个简单的webapp,它使用绑定到contrib.auth来注册和登录用户。(我使用的是开箱即用,没有任何修改。)我可以通过Twitter注册新用户,而不会出现问题,这会将他们作为登录用户返回应用程序。但是,随后尝试登录用户时会返回以下错误: Traceback: File "/app/lib/python2.7/site-packages/django/core/handlers/base.py" in get_respons

这里是Django高级初学者。我正把头撞在墙上想弄明白这件事。我有一个简单的webapp,它使用绑定到contrib.auth来注册和登录用户。(我使用的是开箱即用,没有任何修改。)我可以通过Twitter注册新用户,而不会出现问题,这会将他们作为登录用户返回应用程序。但是,随后尝试登录用户时会返回以下错误:

Traceback:
File "/app/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/app/thislist/twython_django_oauth/views.py" in thanks
  80.     login(request, user)
File "/app/lib/python2.7/site-packages/django/contrib/auth/__init__.py" in login
  82.     request.session[BACKEND_SESSION_KEY] = user.backend

Exception Type: AttributeError at /thanks
Exception Value: 'AnonymousUser' object has no attribute 'backend'
我注意到的一个异常现象是,在遇到此问题的注册用户的Twitter帐户中,webapp显示为授权两次。顺便说一句,这一切在几周前似乎运作良好。我有两个注册的Twitter用户,可以毫无问题地登录。在这些帐户中,应用程序似乎只被授权一次。然而,我似乎无法将应用程序拨回这些用户注册时的状态,以确定我所做的哪些更改可能导致了问题。如果有人了解为什么这里的工作流返回匿名用户,尽管用户似乎已使用适当的凭据注册,我将非常感谢您的回复

更新:我已经找到了问题的原因。每次用户成功输入Twitter凭据后被重定向回应用程序时,twython_django都会尝试使用新的“oauth_token_secret”登录,而不是获取注册期间生成并存储在webapp Twitter配置文件数据库中的秘密令牌。因此,django无法对用户进行身份验证。所以问题是:这为什么不呢

    try:
    user = User.objects.get(username = authorized_tokens['screen_name'])
使用存储的秘密令牌生成用户对象。

我是Twython(以及相关Twython Django包)的作者

我已经看了你的问题一段时间了,我有点不知道问题是什么。这是我第一次听说它,我认为Django的最新版本中没有任何变化会影响这一点(我仔细检查了authenticate()和相关的…)

不过,我很乐意帮助您进行调试——作为一种快速的健全性检查,您是否尝试过打开控制台并使用示例数据手动运行authenticate()?最终,这似乎是匿名用户产生问题的原因。缩小范围会有所帮助,因为try/except并不是真正的问题——所做的只是检查数据库中是否存在用户,如果不存在,则创建用户。它与身份验证完全无关。:)


让我知道我是否可以帮助您调试,如果您仍然需要任何帮助,请随时亲自联系我

当您第一次登录时,示例代码将创建一个新的django用户,用户名=authorized_tokens['screen_name'],密码=authorized_tokens['oauth_token\u secret']。 第二次登录时,授权的\u令牌['oauth\u token\u secret']会更改,因此如果您使用更改的令牌进行身份验证,它将返回AnonymousUser,因为密码错误

要使其正常工作,请在后面添加以下行:

user = User.objects.get(username = authorized_tokens['screen_name'])
user.set_password(authorized_tokens['oauth_token_secret'])
user.save()

希望这个答案是清楚的。请随意提问

我不确定这是否适用,但我想我在尝试以这种方式处理用户对象(如从ORM检索)时遇到了类似的问题。具有后端属性的对象不是从ORM获得的,而是从用户登录(使用authenticate())获得的。至少在普通身份验证中是这样工作的。