1

私は Django アプリを構築しており、twython-django を使用して、フォームを送信するときに Twitter ユーザーを認証しようとしています。この例で提案されているように、views.py、urls.py、およびmodels.pyファイルを編集しようとしましたhttps://github.com/ryanmcgrath/twython-django/tree/master/twython_django_oauthしかし、私は単にそれを推測していますだから私はそれがうまくいかない理由だと確信しています。

これを機能させる方法を教えてください。私は Twitter ラッパーにまったく慣れていないので、どんな助けでも大歓迎です。

私が達成しようとしている流れ:

  1. ユーザーがフォームからメッセージを送信する
  2. [送信] ボタンを押すと、ユーザーは Twitter アカウントの認証を求められます
  3. ユーザーのメッセージ、Twitter の名前、Twitter の画面名、profile_image_url、followers_count がデータベースに保存されます (Heroku Postgres を使用しています)。
  4. ユーザーのプロフィール画像、名前、screen_name、およびメッセージが (Twitter のような) フィードの index.html に出力されます。

私のviews.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 でフォークして TwitterProfile モデルに追加し、適切なコードを Thanks ビューに追加してそれらもロードするか、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 に答える