Как я могу использовать Django Social Auth для подключения к Twitter?

Я пытаюсь использовать пакет 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 вызвала слишком много переадресаций.

Я немного потерялся относительно того, что я должен делать в целом. Я создал приложение в твиттере с URL-адресом моего сайта для создания ключа API/секрета. Будем очень признательны за любые советы о том, в каком направлении мне идти, или ссылки на рабочие примеры.


person djq    schedule 05.03.2013    source источник
comment
URL-адрес для запуска аутентификации Twitter должен быть {% url socialauth_begin "twitter" %}, а не 'twitter_app'. Это имя представляет серверную часть, которую вы собираетесь использовать. Также вы должны включить DSA urls.py в свои основные URL-адреса с помощью такого правила: ('', include('social_auth.urls')). Этот параметр SOCIAL_AUTH_ENABLED_BACKENDS больше не существует.   -  person omab    schedule 05.03.2013
comment
Спасибо, @omab, я внес эти изменения, и когда я нажимаю mysite.com/twitter, я просто переношу на страницу, как если бы я вошел в систему (хотя мне ничего не нужно было делать).   -  person djq    schedule 05.03.2013
comment
попробуйте создать страницу /twitter/done/   -  person catherine    schedule 11.03.2013
comment
Я прочитал документацию сейчас, и там не указано, что вы должны создать URL-адрес Twitter или представление. Вам просто нужно поместить адрес твиттера в свой шаблон.   -  person catherine    schedule 12.03.2013
comment
опубликуйте свой полный urls.py, поэтому, если опубликованный вами заказ похож на тот, который вы используете, последний никогда не будет достигнут, поскольку для начала все соответствует первому правилу (url('', include('social_auth.urls')),)   -  person Hedde van der Heide    schedule 15.03.2013


Ответы (1)


Я дам вам образец, и это индивидуальный вход в твиттер,

  1. название приложения социальное
  2. pip установить Twython
  3. создайте LOGIN_REDIRECT_URL, TWITTER_SECRET и TWITTER_KEY

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>
person catherine    schedule 05.03.2013
comment
Спасибо за пример. Знаете ли вы, будет ли аспект views.py похож на аспект django-socialauth? - person djq; 05.03.2013
comment
да, это источник, но я немного его настраиваю, потому что за ним сложно следить и использовать стороннее приложение. - person catherine; 05.03.2013
comment
ок - проверю. Были ли это единственные изменения в settings.pyключах Twitter? Кроме того, что вы добавили к urls.py? - person djq; 05.03.2013
comment
твиттер ключи и секрет. Я забыл коды urls.py извините. сразу обновлю - person catherine; 05.03.2013