Django Twitter OAuth认证
我正在尝试在我的Django应用程序中实现通过OAuth进行Twitter认证,但在收到Twitter的回调后遇到了这个错误:
Traceback:
File "/Library/Python/2.6/site-packages/django/core/handlers/base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/flavioramos/projects/sobo/sobo/../sobo/views.py" in twitter_authenticated
105. auth_login(request, user)
File "/Library/Python/2.6/site-packages/django/contrib/auth/__init__.py" in login
71. user.save()
File "/Library/Python/2.6/site-packages/django/contrib/auth/models.py" in save
430. raise NotImplementedError
Exception Type: NotImplementedError at /login/authenticated
Exception Value:
我的登录/认证视图如下:
def twitter_authenticated(request):
token = oauth.Token(request.session['request_token']['oauth_token'],
request.session['request_token']['oauth_token_secret'])
client = oauth.Client(consumer, token)
resp, content = client.request(access_token_url, "GET")
if resp['status'] != '200':
print content
raise Exception("Invalid response from Twitter.")
access_token = dict(cgi.parse_qsl(content))
try:
user = User.objects.get(username=access_token['screen_name'])
except User.DoesNotExist:
user = User.objects.create_user(access_token['screen_name'],
'%s@twitter.com' % access_token['screen_name'],
access_token['oauth_token_secret'])
profile = Profile()
profile.user = user
profile.oauth_token = access_token['oauth_token']
profile.oauth_secret = access_token['oauth_token_secret']
profile.save()
user = authenticate(username=access_token['screen_name'],password=access_token['oauth_token_secret'])
auth_login(request, user)
return HttpResponseRedirect('/')
这段代码来自一个python-oauth2的示例应用。
我需要为此编写自己的认证后端吗?
我对Django还很陌生,任何帮助都将不胜感激。
谢谢,
2 个回答
0
我不太确定,但我觉得
*auth_login(request, user)*
应该是:login(request, user)
(当然,这个login应该在你的登录/认证视图的顶部从django.contrib.auth导入)
1
我也遇到过同样的问题。看起来oauthtwitter用到的库发生了变化。要修复你本地的版本,可以按照以下步骤操作:
在:
/usr/local/lib/python2.6/dist-packages/oauth_python_twitter-1.0-py2.6.egg/oauthtwitter.py
找到第37行,把它从:
Api.__init__(self, access_token.key, access_token.secret)
改成:
Api.__init__(self, consumer_key, consumer_secret, access_token.key, access_token.secret)
现在所有需要的变量都能正确传递了。