2

Django 高级初学者在这里。我正用头撞墙,试图弄清楚这一点。我有一个简单的 web 应用程序,它使用绑定到 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'])

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

4

2 回答 2

2

第一次登录时,示例代码会创建一个新的 django 用户,用户名=authorized_tokens['screen_name'],密码=authorized_tokens['oauth_token_secret']。第二次登录时,authorized_tokens['oauth_token_secret'] 发生了变化,所以如果你使用更改后的token进行身份验证,由于密码错误,它会返回AnonymousUser。

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

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

希望这个答案很清楚。请随时提问

于 2012-01-16T17:18:31.933 回答
0

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

我现在已经查看了您的问题,对于问题是什么,我有点迷茫。这是我第一次听说它,而且我认为在最近的 Django 版本中没有任何改变会影响这一点(我仔细检查了 authenticate() 和相关的确定......)。

不过,我很乐意帮助调试 - 就像快速检查一样,您是否尝试过打开控制台并使用示例数据手动运行 authenticate()?最终,这似乎是造成 AnonymusUser 问题的原因。缩小此处的范围会有所帮助,因为问题实际上不在于 try/except - 所做的只是检查数据库中是否存在用户,如果不存在则创建它们。它根本与身份验证无关。:)

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

于 2012-01-08T22:42:21.450 回答