2013-03-05 34 views
12

Tôi đang cố gắng sử dụng gói Django Social Auth để kết nối với Twitter, nhưng tôi gặp khó khăn khi hiểu chính xác cách thực hiện việc này vì tôi không thể tìm thấy bất kỳ ví dụ nào. Tôi giả định rằng Django Social Auth là gói tốt nhất để sử dụng cho mục đích này.Làm thế nào tôi có thể sử dụng Django Social Auth để kết nối với Twitter?

tôi đã xem xét một vài ví dụ có sử dụng Facebook, và từ này đã được thêm vào phần sau đây để settings.py tập tin của tôi:

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 

Trong urls.py Tôi đã thêm các dòng sau đây:

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

Và trong một tệp có tên twitter.py Tôi đã thêm thông tin sau để tạo chế độ xem:

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

Tôi đã sau đó tạo ra một tập tin mẫu được gọi là twitter.html với cấu trúc sau:

{% extends "base.html" %} 

{% block script %} 

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

{% endblock %} 

Điều này dẫn đến các thông báo lỗi sau:

Trang web tại http://example.com/twitter/done đã dẫn đến quá nhiều chuyển hướng.

Tôi bị mất một chút so với những gì tôi nên làm tổng thể. Tôi đã tạo một ứng dụng trên twitter với url trang web của tôi để tạo api/khóa bí mật. Bất kỳ lời khuyên nào về hướng tôi nên đi, hoặc liên kết đến các ví dụ làm việc sẽ được đánh giá cao.

+1

URL để bắt đầu xác thực twitter nên được '{% url socialauth_begin "twitter" %}', không ' 'twitter_app''. Tên đó đại diện cho chương trình phụ trợ bạn định sử dụng.Ngoài ra, bạn nên bao gồm DSA 'urls.py' vào các url chính của bạn với một quy tắc như sau:' ('', include ('social_auth.urls')) '. Cài đặt này 'SOCIAL_AUTH_ENABLED_BACKENDS' không tồn tại nữa. – omab

+0

Cảm ơn @omab Tôi đã thực hiện những thay đổi này và khi tôi nhấp vào 'mysite.com/twitter', nó chỉ đưa tôi đến một trang như thể tôi đã đăng nhập (mặc dù tôi không phải làm gì cả). – djq

+0

thử tạo/twitter/done/page – catherine

Trả lời

5

tôi sẽ cung cấp cho bạn một mẫu và đây là một tên đăng nhập tùy chỉnh twitter,

  1. tên của ứng dụng này là xã hội
  2. pip cài đặt Twython
  3. tạo LOGIN_REDIRECT_URL, TWITTER_SECRET và 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 
     ......... 

mẫu

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

Cảm ơn ví dụ. Bạn có biết nếu khía cạnh 'views.py' sẽ tương tự với' django-socialauth'? – djq

+0

yeah đó là nguồn gốc nhưng tôi tùy chỉnh nó một chút bởi vì nó khó theo dõi và sử dụng ứng dụng của bên thứ ba – catherine

+0

ok - Tôi sẽ kiểm tra nó ra. Đó có phải là những thay đổi duy nhất đối với 'settings.py'các phím twitter không? Ngoài ra, bạn đã thêm gì vào 'urls.py'? – djq

Các vấn đề liên quan