简体   繁体   English

如何使用Django Social Auth连接Twitter?

[英]How can I use Django Social Auth to connect with Twitter?

I'm trying to use the Django Social Auth package to connect with Twitter, but I'm having difficulty understanding how exactly to do this as I can't find any examples. 我正在尝试使用Django Social Auth软件包与Twitter连接,但我很难理解如何做到这一点,因为我找不到任何例子。 I am assuming that Django Social Auth is the best package to use for this purpose. 我假设Django Social Auth是用于此目的的最佳软件包。

I've looked at a few examples that use Facebook, and from this have added the following to my settings.py file: 我看了几个使用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 

In urls.py I've added the following lines: urls.py我添加了以下行:

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

And in a file called twitter.py I've added the following to create a view: 在一个名为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))

I've then created a template file called twitter.html with the following structure: 然后我创建了一个名为twitter.html的模板文件,其结构如下:

{% extends "base.html" %}

{% block script %}

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

{% endblock %}

This results in the following error message: 这会导致以下错误消息:

The webpage at http://example.com/twitter/done has resulted in too many redirects. http://example.com/twitter/done上的网页导致了太多重定向。

I'm a little bit lost as to what I should be doing overall. 关于我应该做什么,我有点迷茫。 I have created an app on twitter with my site url to generate the api/secret key. 我在twitter上用我的网站url创建了一个app来生成api / secret密钥。 Any advice on what direction I should go, or links to working examples would be greatly appreciated. 任何关于我应该去哪个方向的建议,或者对工作实例的链接都将不胜感激。

I will give you a sample and this is a customize twitter login, 我会给你一个样本,这是一个自定义的Twitter登录,

  1. the name of the app is social 该应用程序的名称是社交名称
  2. pip install Twython 点击安装Twython
  3. create LOGIN_REDIRECT_URL, TWITTER_SECRET and TWITTER_KEY 创建LOGIN_REDIRECT_URL,TWITTER_SECRET和TWITTER_KEY

settings.py settings.py

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

models.py 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 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 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
        .........

template 模板

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM