【问题标题】:How can I use Django Social Auth to connect with Twitter?如何使用 Django Social Auth 连接 Twitter?
【发布时间】:2013-02-19 08:58:35
【问题描述】:

我正在尝试使用 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的网页也导致了 许多重定向。

对于我应该做的整体事情,我有点迷茫。我在 twitter 上用我的网站 url 创建了一个应用程序来生成 api/secret 密钥。任何关于我应该走的方向的建议,或工作示例的链接都将不胜感激。

【问题讨论】:

  • 启动推特认证的 URL 应该是{% url socialauth_begin "twitter" %},而不是'twitter_app'。该名称代表您打算使用的后端。此外,您应该使用如下规则将 DSA urls.py 包含到您的主 URL 中:('', include('social_auth.urls'))。此设置SOCIAL_AUTH_ENABLED_BACKENDS 已不存在。
  • 谢谢@omab 我做了这些更改,当我点击mysite.com/twitter 时,它只是将我带到一个页面,就好像我已经登录一样(即使我不需要做任何事情) .
  • 尝试创建 /twitter/done/ 页面
  • 我现在阅读了文档,并没有说明您必须创建 twitter url 或视图。您只需将 url twitter 放入您的模板中
  • 发布您的完整 urls.py,因此如果您发布的顺序与您使用的顺序一样,则永远不会达到后者,因为一切都符合初学者的第一条规则 (url('', include('social_auth.urls')),)

标签: python django django-templates django-socialauth


【解决方案1】:

我会给你一个示例,这是一个自定义的 twitter 登录,

  1. 应用的名称是social
  2. pip install 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>

【讨论】:

  • 感谢您的示例。你知道views.py 方面是否与django-socialauth 相似?
  • 是的,这就是起源,但我对其进行了一些定制,因为它很难遵循和使用第三方应用程序
  • 好的 - 我会测试一下。这些是对settings.pytwitter 键的唯一更改吗?另外你在urls.py 中添加了什么?
  • 推特密钥和秘密。抱歉,我忘记了 urls.py 代码。我会马上更新的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2015-10-19
  • 2014-05-13
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多