2013-03-05 2 views
12

Ich versuche, das Django Social Auth Paket zu verwenden, um mit Twitter zu verbinden, aber ich habe Schwierigkeiten zu verstehen, wie genau dies zu tun ist, wie ich keine Beispiele finden kann. Ich gehe davon aus, dass Django Social Auth das beste Paket für diesen Zweck ist.Wie kann ich mit Django Social Auth eine Verbindung zu Twitter herstellen?

Ich habe ein paar Beispiele gesucht, die Facebook nutzen, und daraus die folgenden meiner settings.py Datei hinzugefügt haben:

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 habe ich hinzugefügt die folgenden Zeilen:

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

Und in einer Datei namens twitter.py ich habe die eine Ansicht erstellen wie folgt ergänzt:

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

Ich habe erstellt dann eine Vorlagendatei twitter.html mit der folgenden Struktur genannt:

{% extends "base.html" %} 

{% block script %} 

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

{% endblock %} 

Daraus ergibt sich die folgende Fehlermeldung:

Die Webseite unter http://example.com/twitter/done in zu viele Umleitungen geführt hat.

Ich bin ein wenig verloren, was ich insgesamt tun sollte. Ich habe eine App auf Twitter mit meiner Website-URL erstellt, um den api/geheimen Schlüssel zu generieren. Irgendwelche Ratschläge, in welche Richtung ich gehen sollte, oder Links zu Arbeitsbeispielen würden sehr geschätzt werden.

+1

Die URL sollte die Twitter-Authentifizierung, um zu starten '{% url socialauth_begin "twitter" %}', nicht ' 'twitter_app''. Dieser Name repräsentiert das Backend, das Sie verwenden möchten.Außerdem sollten Sie DSA 'urls.py' in Ihre Haupt-URLs mit einer Regel wie der folgenden einschließen:' ('', include ('social_auth.urls')) '. Diese Einstellung 'SOCIAL_AUTH_ENABLED_BACKENDS' existiert nicht mehr. – omab

+0

Danke @omab Ich habe diese Änderungen vorgenommen, und wenn ich auf "mysite.com/twitter" klicke, bin ich auf einer Seite, als wäre ich eingeloggt (obwohl ich nichts tun musste). – djq

+0

versuche,/twitter/done/page – catherine

Antwort

5

Ich gebe Ihnen ein Beispiel und das ist ein customize twitter Login,

  1. der Name der App ist soziale
  2. pip Twython installieren
  3. erstellen LOGIN_REDIRECT_URL, TWITTER_SECRET und 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 
     ......... 

Vorlage

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

Danke für das Beispiel. Weißt du, ob der 'views.py' Aspekt mit' django-socialauth' ähnlich wäre? – djq

+0

Ja, das ist der Ursprung, aber ich passe es ein wenig, weil es schwer zu folgen und Drittanbieter-App verwenden – catherine

+0

ok - ich werde es testen. Waren das die einzigen Änderungen an "settings.py" den Twitter-Schlüsseln? Was hast du zu "urls.py" hinzugefügt? – djq

Verwandte Themen