1

我正在构建一个 Django 应用程序,并尝试在他们提交表单时使用 twython-django 对 Twitter 用户进行身份验证。我已尝试按照此示例https://github.com/ryanmcgrath/twython-django/tree/master/twython_django_oauth的建议编辑我的views.py、urls.py 和models.py 文件,但我只是在猜测所以我确定这就是它不起作用的原因。

你能帮我解决如何让它工作吗?我对 Twitter 包装器完全陌生,因此非常感谢任何帮助。

我试图实现的流程:

  1. 用户通过表单提交消息
  2. 用户被要求在点击“提交”按钮时验证他们的 Twitter 帐户
  3. 用户的消息、Twitter 名称、Twitter screen_name、profile_image_url 和 follower_count 保存在数据库中(我使用的是 Heroku Postgres)
  4. 用户的个人资料图像、姓名、screen_name 和消息被打印到 index.html 中(类似 Twitter)的提要中。

我的意见.py:

 def logout(request, redirect_url=settings.LOGOUT_REDIRECT_URL):
     django_logout(request)
     return HttpResponseRedirect(request.build_absolute_uri(redirect_url))

 def submit(request):
     twitter = Twython(
         twitter_token=settings.TWITTER_KEY,
         twitter_secret=settings.TWITTER_SECRET,
         callback_url=request.build_absolute_uri(reverse('alpha.views.submit'))
)

auth_props = twitter.get_authentication_tokens()

request.session['request_token'] = auth_props
return HttpResponseRedirect(auth_props['auth_url'])

form = MessageForm(request.session.get('message'))
if form.is_valid():
    new_message = form.save()
    return HttpResponseRedirect('/')
else:
    request.session['message'] = request.POST

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

try:
    user = User.objects.get(username = authorized_tokens['screen_name'])
except User.DoesNotExist:
        user = User.objects.create_user(authorized_tokens['screen_name'], authorized_tokens['oauth_token_secret'])
        profile = Message()
        profile.user = user
        profile.name = name
        profile.profile_image_url = profile_image_url
        profile.oauth_token = authorized_tokens['oauth_token']
        profile.oauth_secret = authorized_tokens['oauth_token_secret']
        profile.save()

user = authenticate(
        username = authorized_tokens['screen_name'],
        password = authorized_tokens['oauth_token_secret']

)
login(request, user)
return HttpResponseRedirect(redirect_url)

免责声明:我是新手,所以上面的代码可能是一团糟!

4

1 回答 1

1

是的,您的用例与 twython-django 的用例不同,但这并不意味着它不适用于您的情况,您可以按照流程使用该库。按照主页上的说明设置完所有内容后,您的views.py 需要这样的内容:

from django.shortcuts import redirect, reverse

def submit(request):
    # initial form submission, first check if we're authenticated
    # if we are, process as normal, otherwise redirect to the login
    # page. If you've set up twython-django correctly, it'll redirect
    # to twitter for the actual login.
    if request.method == "POST":
        if request.user.is_authenticated():
            form = MessageForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('/')
            else:
                # Modify this to display validation errors
                pass
        else:
            request.session['message'] = request.POST
            # the reverse(submit) resolves this view for redirection
            # back from the twitter authentication
            return redirect(settings.LOGIN_URL, next=reverse(submit))

    # A Get request, where we should first check for the message stored
    # We then process the form and remove it from session to prevent
    # accidental re-use.
    else:
        if 'message' in request.session and request.user.is_authenticated():
            form = MessageForm(request.session['message'])
            del request.session['message']
            if form.is_valid():
                form.save()
                return redirect('/')
            else:
                # Modify this to display validation errors
                pass
        else:
            # handle the case where this is a get request and the variable
            # isn't in session
            pass

至于加载他们的个人资料图片和关注者数量,twython django 目前根本没有处理这些。您可以在 github 上 fork 并将它们添加到 TwitterProfile 模型中,并将适当的代码添加到感谢视图以加载它们,或者您可以将新模型添加到扩展 TwitterProfile 的代码中。

from twython_django_oauth.models import TwitterProfile
from django import models

class ExtendedTwitterProfile(models.Model)
    profile = models.OneToOne(TwitterProfile, related_name="extended")
    avatar = models.CharField(max_length=255)
    followers = models.IntegerField()

并将代码添加到提交视图中以根据需要添加/更新配置文件。

extended_profile = ExtendedTwitterProfile.objects.get_or_create(profile=request.user.twitterprofile)
extended_profile.avatar = avatarurl
extended_profile.followers = followercount

extended_profile.save()

您应该可以通过以下方式访问这些详细信息

user.twitterprofile.extended.avatar

虽然,我过去曾使用 url 来获取头像,例如:

# avatar redirection urls
url(r'^avatar/(?P<userid>[0-9A-Za-z_]+)$', redirect_to,
    { 'url' : 'http://api.twitter.com/1/users/profile_image/%(userid)s.json' }, name='avatar' ),    
url(r'^avatar/(?P<userid>[0-9A-Za-z_]+)/(?P<size>[a-z]+)$', redirect_to, 
    { 'url' : 'http://api.twitter.com/1/users/profile_image?screen_name=%(userid)s&size=%(size)s' } ),

在要显示头像的模板中,只需使用 url 模板标签和 img 标签即可进行反向 url 解析,如下所示:

<img src="{% url avatar userid=request.user.username %}" />

作为进一步的指针,您还可以通过 Twitter 的 json API 请求所有用户的基本详细信息

https://twitter.com/users/zandeez.json

例如,将获得我的公开个人资料,您可以在 python 中使用 urllib 甚至 javascript/ajax 使用的形式,具体取决于您想要对关注者数量执行的操作。

希望这可以帮助您解决问题,如果您需要更多帮助,请随时提出。

于 2013-01-04T10:31:09.117 回答