2013-03-05 7 views
12

Sto provando a utilizzare il pacchetto Django Social Auth per connettersi a Twitter, ma ho difficoltà a capire come eseguire esattamente questa operazione poiché non riesco a trovare alcun esempio. Suppongo che Django Social Auth sia il miglior pacchetto da utilizzare per questo scopo.Come posso utilizzare Django Social Auth per connettermi con Twitter?

Ho guardato alcuni esempi che utilizzano Facebook, e da questo hanno aggiunto il seguente al mio settings.py lima:

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 ho aggiunto le seguenti righe:

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

E in un file chiamato twitter.py ho aggiunto quanto segue per creare una vista:

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)) 

Ho quindi creato un file modello chiamato twitter.html con la seguente struttura:

{% extends "base.html" %} 

{% block script %} 

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

{% endblock %} 

Il risultato è il seguente messaggio di errore:

La pagina web all'indirizzo http://example.com/twitter/done ha provocato anche molti reindirizzamenti.

Sono un po 'perso per quello che dovrei fare in generale. Ho creato un'app su twitter con l'url del mio sito per generare l'API/chiave segreta. Qualunque consiglio su quale direzione dovrei andare, o collegamenti a esempi di lavoro sarebbe molto apprezzato.

+1

L'URL per avviare l'autenticazione di Twitter dovrebbe essere '{url% socialauth_begin "Twitter" %}', 'non 'twitter_app''. Quel nome rappresenta il back-end che intendi utilizzare.Inoltre dovresti includere DSA 'urls.py' nei tuoi URL principali con una regola come questa:' ('', include ('social_auth.urls')) '. Questa impostazione 'SOCIAL_AUTH_ENABLED_BACKENDS' non esiste più. – omab

+0

Grazie a @omab ho apportato queste modifiche e quando clicco su 'mysite.com/twitter' mi porta in una pagina come se fossi loggato (anche se non dovevo fare nulla). – djq

+0

prova a creare/twitter/done/pagina – catherine

risposta

5

ti darò un campione e questo è un account di accesso personalizzare Twitter,

  1. il nome della app è sociale
  2. pip installare Twython
  3. creare LOGIN_REDIRECT_URL, TWITTER_SECRET e 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 
     ......... 

modello

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

Grazie per l'esempio. Sai se l'aspetto 'views.py' sarebbe simile a' django-socialauth'? – djq

+0

sì, questa è l'origine ma la personalizzo un po 'perché è difficile da seguire e utilizzare l'app di terze parti – catherine

+0

ok - lo verificherò. Erano queste le uniche modifiche a 'settings.py' i tasti twitter? Inoltre cosa hai aggiunto a 'urls.py'? – djq

Problemi correlati