如何使用Django Social Auth连接Twitter?

时间:2013-03-05 04:09:34

标签: python django django-templates django-socialauth

我正在尝试使用Django Social Auth包来连接Twitter,但我很难理解如何做到这一点,因为我找不到任何示例。我假设Django Social Auth是用于此目的的最佳软件包。

我看了几个使用Facebook的例子,并从中添加了以下settings.py文件:

AUTHENTICATION_BACKENDS = (
    'social_auth.backends.twitter.TwitterBackend',
    'django.contrib.auth.backends.ModelBackend',
)

# overwriting default templates
TEMPLATE_CONTEXT_PROCESSORS = (    
    'django.core.context_processors.static',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.contrib.messages.context_processors.messages',
    'social_auth.context_processors.social_auth_by_type_backends',
    'django.contrib.auth.context_processors.auth',
)

SOCIAL_AUTH_ENABLED_BACKENDS = ('twitter')
SOCIAL_AUTH_DEFAULT_USERNAME = 'new_social_auth_user'

# Social media login info:
TWITTER_CONSUMER_KEY         = 'xxx'
TWITTER_CONSUMER_SECRET      = 'xxxxxx'

# 'magic' settings
SOCIAL_AUTH_COMPLETE_URL_NAME = 'socialauth_complete'
SOCIAL_AUTH_ASSOCIATE_URL_NAME = 'associate_complete'

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    'social_auth.backends.pipeline.associate.associate_by_email',
    'social_auth.backends.pipeline.misc.save_status_to_session',
    'social.pipeline.redirect_to_form',
    'social.pipeline.username',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'social_auth.backends.pipeline.misc.save_status_to_session',
    'social.pipeline.redirect_to_form2',
    'social.pipeline.first_name',
)

SOCIAL_AUTH_FORCE_POST_DISCONNECT = True
SOCIAL_AUTH_SESSION_EXPIRATION = False 

urls.py我添加了以下几行:

url('', include('social_auth.urls')),
url(r'^twitter/', twitter_app, name='twitter_app')

在名为twitter.py的文件中,我添加了以下内容来创建视图:

from django.contrib.auth import BACKEND_SESSION_KEY
from django.contrib.auth.models import AnonymousUser
from django.http import HttpResponse
from django.http import HttpResponseRedirect #dq
from django.shortcuts import render_to_response
from django.template.context import RequestContext

from django.views.decorators.csrf import csrf_exempt
from django.core.cache import cache

from social_auth.models import UserSocialAuth
from social_auth.views import complete as social_complete
from social_auth.utils import setting
from social_auth.backends.twitter import TwitterBackend


# twitter login    
def twitter_app(request):
    """twitter login"""
    if request.user.is_authenticated():
        return HttpResponseRedirect('done')
    else:
        return render_to_response('twitter.html', {'twitter_app_id':setting('TWITTER_CONSUMER_KEY'),
                                                'warning': request.method == 'GET'}, RequestContext(request))

然后我创建了一个名为twitter.html的模板文件,其结构如下:

{% extends "base.html" %}

{% block script %}

Login with <a href="{% url socialauth_begin 'twitter' %}">Twitter</a>

{% endblock %}

这会导致以下错误消息:

  

http://example.com/twitter/done的网页也是如此   许多重定向。

我有点失去了我应该做的整体。我在twitter上用我的网站url创建了一个app来生成api / secret密钥。关于我应该去哪个方向的任何建议,或者与工作实例的链接都将不胜感激。

1 个答案:

答案 0 :(得分:5)

我会给你一个示例,这是一个自定义的Twitter登录,

  1. 该应用的名称是社交
  2. pip install Twython
  3. 创建LOGIN_REDIRECT_URL,TWITTER_SECRET和TWITTER_KEY
  4. <强> settings.py

    # Twitter settings
    TWITTER_KEY = 'xxxxxx'
    TWITTER_SECRET = 'xxxxxxxx'
    

    <强> models.py

    class TwitterProfile(models.Model):
        user = models.ForeignKey(User)
        oauth_token = models.CharField(
            max_length=200
            )
        oauth_secret = models.CharField(
            max_length=200
            )
        screen_name = models.CharField(
            max_length=50, 
            blank=True, null=True
            )
    
        def __unicode__(self):
            return "{0}".format(self.user)
    

    <强> urls.py

    urlpatterns = patterns('social.views',      
        url(
            r'^twitter/login/$', 
            "twitter_login", 
            name="twitter_login"
        ),
    
        url(r'^twitter/callback/$', 
            "twitter_callback", 
            name="twitter_callback"
        ),   
    )
    

    <强> views.py

    def twitter_login(request):
        twitter = Twython(
            twitter_token = settings.TWITTER_KEY,
            twitter_secret = settings.TWITTER_SECRET,
            callback_url = request.build_absolute_uri(reverse('social:twitter_callback'))
        )
        auth_props = twitter.get_authentication_tokens()
        request.session['request_token'] = auth_props
        return HttpResponseRedirect(auth_props['auth_url'])
    
    
    def twitter_callback(request, redirect_url=settings.LOGIN_REDIRECT_URL):
        twitter = Twython(
            twitter_token = settings.TWITTER_KEY,
            twitter_secret = settings.TWITTER_SECRET,
            oauth_token = request.session['request_token']['oauth_token'],
            oauth_token_secret = request.session['request_token']['oauth_token_secret'],
        )
    
        authorized_tokens = twitter.get_authorized_tokens()
    
        try:
            profile = TwitterProfile.objects.get(screen_name = authorized_tokens['screen_name'])
            user = User.objects.get(pk=profile.user_id)
            user.backend = 'django.contrib.auth.backends.ModelBackend'
    
            if user.is_active:
                auth_login(request, user)
                return HttpResponseRedirect(reverse('app_name:url_name'))
            else:
                //failed back to login
                return HttpResponseRedirect(reverse('app_name:login'))
        except TwitterProfile.DoesNotExist:
            screen_name = authorized_tokens['screen_name']
            oauth_token = authorized_tokens['oauth_token']
            oauth_token_secret = authorized_tokens['oauth_token_secret']
    
            //create new twitter profile
            //create new user here
            //authenticate the new register user then login
            .........
    

    <强>模板

    <a href="{% url social:twitter_login %}">Twitter</a>