2013-03-05 34 views
12

Próbuję użyć pakietu Django Social Auth do połączenia się z Twitterem, ale mam problem ze zrozumieniem, jak to zrobić, ponieważ nie mogę znaleźć żadnych przykładów. Zakładam, że najlepszym pakietem do tego celu jest Django Social Auth.Jak mogę używać Django Social Auth do łączenia się z Twitterem?

Szukałem na kilka przykładów, które korzystają z Facebooka, a od tego dodałem następujące do mojego settings.py pliku:

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 

W urls.py Dodałem następujące linie:

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

a w pliku o nazwie twitter.py Dodałem następujące czynności, aby utworzyć widok:

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

Mam następnie utworzony plik szablonu o nazwie twitter.html o następującej strukturze:

{% extends "base.html" %} 

{% block script %} 

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

{% endblock %} 

Skutkuje to następującym komunikatem o błędzie:

Strona internetowa pod adresem http://example.com/twitter/done spowodowała zbyt wiele przekierowań .

Jestem trochę zagubiony co do tego, co powinienem robić ogólnie. Stworzyłem aplikację na Twitterze z adresem mojej strony, by wygenerować klucz APi/Secret. Wszelkie rady dotyczące tego, w jakim kierunku powinienem podążać, lub linki do przykładów roboczych będą bardzo mile widziane.

+1

URL, aby rozpocząć uwierzytelnianie twitter powinno być '{% url socialauth_begin "twitter" %}' nie ' 'twitter_app''. Ta nazwa reprezentuje backend, z którego zamierzasz korzystać.Powinieneś również dołączyć 'urls.py' w DSA do swoich głównych adresów URL z taką zasadą:' ('', include ('social_auth.urls')) '. To ustawienie "SOCIAL_AUTH_ENABLED_BACKENDS" już nie istnieje. – omab

+0

Dzięki @omab Wprowadziłem te zmiany, a kiedy kliknę na "mysite.com/twitter", to po prostu zabieram mnie na stronę, tak jakbym był zalogowany (mimo że nie musiałem nic robić). – djq

+0

spróbuj utworzyć/twitter/done/page – catherine

Odpowiedz

5

dam wam próbkę i jest to logowanie Dostosuj twitter,

  1. nazwa aplikacji jest społeczny
  2. pip zainstalować Twython
  3. tworzyć LOGIN_REDIRECT_URL, TWITTER_SECRET i TWITTER_KEY

ustawienia.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 
     ......... 

szablon

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

Dzięki za przykład. Czy wiesz, czy aspekt 'views.py' byłby podobny do' django-socialauth'? – djq

+0

Tak, to jest pochodzenie, ale dostosowuję go trochę, ponieważ trudno jest śledzić i używać aplikacji innej firmy. – catherine

+0

ok - przetestuję to. Czy były to jedyne zmiany w 'settings.py' klawiszach Twittera? Co jeszcze dodałeś do 'urls.py'? – djq