1

gdata.youtube python ライブラリを使用して、YouTube に動画を投稿できる機能を備えた python/django を利用したアプリがあります。

私の参照は次のとおりです: https://developers.google.com/youtube/1.0/developers_guide_python

前の開発者は、ビデオをアップロードするための要件や認証を満たすなど、この非常に便利なページにある指示に従いました。しかし、うまくいきません。firebug を実行すると、500 INTERNAL SERVER ERROR が発生し、ビューで upload_prepare 関数にトレースされます。これはおそらく保存部分にあります。

    def upload_prepare(request):
        if request.POST:
            form = UploadForm(request.user, request.POST)
            if form.is_valid():
                #error is in the next line
                video = form.save()

彼はまた、Browserupload を介して YouTube ビデオを投稿する方法の指示に従いました。

私のコードは次のとおりです。

models.py

    class Category(models.Model):
        text = models.CharField(max_length=100)
        label = models.CharField(max_length=100)
        scheme = models.URLField()

        def toGData(self):
            return gdata.media.Category(
                text=self.text,
                label=self.label,
                scheme=self.scheme)

    class YoutubeUser(models.Model):
        username = models.CharField(max_length=50)
        ...

        #Initialize gdata.youtube.service.YouTubeService object
        def yt_service(self):
            try:
                return selt._yt_service
            except AttributeError:
        #setting up developer key and client ID
                yt_service = gdata.youtube.service.YouTubeService()
                yt_service.developer_key = settings.SYNCR_YT_DEVKEY
                yt_service.client_id = 'LOLtest'
        #setting up a authentication token
                if self.token:
                    yt_service.SetAuthSubToken(self.token)
                self._yt_service = yt_service
                return yt_service

        #Setting up AuthSub authentication for web apps
        def authsub_url(self, request):
        #urls.py url
            base = reverse('authlanding', args=(self.id,))
            next = 'http://%s%s?next=%s' % (request.get_host(), base, urllib2.quote(request.build_absolute_uri()))
            scope = 'http://gdata.youtube.com'
            secure = False
            session = True

            return self.yt_service.GenerateAuthSubUrl(next, scope, secure, session)

        #upgrade to a session token
        def upgrade_to_session(self):
            yt_service = self.yt_service
            yt_service.SetAuthSubToken(self.token)
            yt_service.UpgradeToSessionToken()
            self.token = yt_service.current_token.get_token_string()
            self.save()

これまでのところ、models.py のコード、forms.py のコード、エラーの原因となった保存関数はここにあります (上の upload_prepare ビューを見てください)。

フォーム.py

    class UploadForm(forms.Form):
        video_title = forms.CharField(max_length=100)
        ...
        #https://developers.google.com/youtube/1.0/developers_guide_python#UploadingVideos
        #Browser-based upload
        def save(self):
            mediagroup = gdata.media.Group(
                title=gdata.media.Title(text=self.cleaned_data['video_title']),
                description=gdata.media.Description(description_type="plain", text=self.cleaned_data['video_description']),
                keywords=gdata.media.Keywords(text=self.cleaned_data['tags']),
        #category already in GData format look in models.py
                category=self.cleaned_data['category'].toGData(),
                player=None,
            )
            video_entry = gdata.youtube.YouTubeVideoEntry(media=mediagroup)
            response = self.yt_user.yt_service.GetFormUploadToken(video_entry)
            post_url = response[0]
            youtube_token = response[1]

            video = Video.objects.create(
                author=self.yt_user,
                post_url=post_url,
                youtube_token=youtube_token,
                title=self.cleaned_data['video_title'],
                description=self.cleaned_data['video_description'],
                tag_list=self.cleaned_data['tags'],
            )
            self.video = video
            return video

一方、データを渡すために html で使用されるフォームは、django フォーム、django カスタム タグ付け、および ajax を組み合わせたものです。

フォーム.py

    class UploadForm(forms.Form):
        video_title = forms.CharField(max_length=100)
        video_description = forms.CharField(widget=forms.Textarea(attrs={'cols': 60,
                                             'rows': 10}))
        category = forms.ModelChoiceField(Category.objects, empty_label=None)
        tags     = TagField(
               label=_('tags (comma separated)'),
               required=True,
               )

youtube_tags.py

    def youtube_upload_form(context):
    #UploadForm from above
        upload_form = UploadForm(context['user'])
        context['upload_form'] = upload_form
        return context

    register.inclusion_tag('syncr/youtube/upload.html',
                   takes_context=True)(youtube_upload_form)

add_post.html

    <script>
        function upload_video_to_youtube(url){
            action = "%s?nexturl=%s" % (youtube_url, url)
            var new_form = create_element('form', {'method': 'post', 'action': action, 'enctype':"multipart/form-data"});
            $('#youtube_upload_form input').each(function(){
                var obj = this.cloneNode(true);
                new_form.appendChild(obj);
            });
            document.body.appendChild(new_form);
            new_form.submit();
        }
    </script>

    {% block body %}
    ...
    <div id="rd2-radioOptionContent" class="hide radioOptionContent">
    {% youtube_upload_form %}
    </div>
    {% endblock %}

私が投稿したコードを皆さんが完璧に理解してくれることを願っています。明確に読めば、リファレンスに投稿された指示のほとんどが従い (データを送信するために使用されるフォームはわずかに異なります)、500 内部サーバー エラーが発生したことを考えると、これらのコード行で問題を見つける必要があります。どんな答えでも大歓迎です。

4

1 に答える 1

0

yt_service メソッドの 2 行目にタイプミスがあります。selt ではなく self にする必要があります。多分それが問題ですか?

于 2012-07-31T23:12:56.433 に答える