使用Twython Oauth的Django app返回'AnonymousUser'对象没有属性'backend'

时间:2011-12-30 18:52:45

标签: django oauth twitter-oauth twython

Django在这里提升了初学者。我正在撞墙,试图弄清楚这个。我有一个简单的webapp,使用绑定到contrib.auth的twython_django_oauth来注册和登录用户。 (我正在使用twython开箱即用而没有任何修改。)我可以通过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用户,可以毫无问题地登录。在这些帐户中,该应用似乎只授权一次。但是,当这些用户注册时,我似乎无法回拨应用程序,以确定我所做的可能导致问题的更改。如果有人知道为什么这里的工作流程返回AnonymousUser,尽管用户似乎注册了相应的凭据,我很感激您的回复!

更新:我已经注意到了问题的原因。每次成功输入Twitter凭据后用户被重定向回应用程序,twython_django会尝试使用新的“oauth_token_secret”记录他/她,而不是抓住注册期间生成的秘密令牌并存储在webapp的Twitter个人资料数据库中。因此,django无法验证用户身份。所以问题是:为什么不这样呢

    try:
    user = User.objects.get(username = authorized_tokens['screen_name'])

使用存储的秘密令牌生成用户对象。

2 个答案:

答案 0 :(得分:2)

当您第一次登录时,示例代码使用username = authorized_tokens ['screen_name']和password = authorized_tokens ['oauth_token_secret']创建一个新的django用户。    第二次登录时,authorized_tokens ['oauth_token_secret']会更改,因此如果您使用更改后的令牌进行身份验证,则会因密码错误而返回AnonymousUser。

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

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

希望这个答案很明确。请随时提问

答案 1 :(得分:0)

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

我现在已经看了一下你的问题,但我对这个问题有点失落。这是我第一次听说过它,我认为最近发布的Django没有任何改变会影响这一点(我仔细检查了authenticate()和相关的确定......)。

我很乐意帮助进行调试 - 只是作为快速的健全性检查,您是否尝试打开控制台并手动运行带有示例数据的authenticate()?最终,这就是使用AnonymusUser产生问题的原因。缩小范围会有所帮助,因为问题不在于try / except - 所有这一切都是检查数据库中是否存在用户,然后如果没有创建它们。它根本不涉及身份验证。 :)

如果您仍需要任何帮助,请告诉我是否可以帮您调试,并随时与我联系!