/videos/compose/'items' 处的 KeyError

KeyError at /videos/compose/ 'items'

我正在使用 YouTube 数据 API 并尝试使用 JSON 获取 YouTube 视频标题,但我得到的是 KeyError at /videos/compose/ 'items'

你们能告诉我这里出了什么问题吗?我打印了变量 video_id,这是正确的,但在检索视频标题时仍然出错。

views.py:

class VideoCreateView(CreateView):
    model = Video
    form_class = VideoForm
    template_name = "videos/video_form.html"
    def form_valid(self, form):
        video = Video()
        video.url = form.cleaned_data['url']
        parse = urllib.parse.urlparse(video.url)
        video_id = urllib.parse.parse_qs(parse.query).get('v')
        if video_id:
            video.youtube_id =video_id[0]
            response = requests.get(f'https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id={video_id[0]}&key=[{ YOUTUBE_API_KEY }]')
            json = response.json()
            title = json["items"][0]["snippet"]["title"]
            video.title = title
            video.save()
        return super().form_valid(form)

urls.py:

app_name = 'videos'

urlpatterns = [
    path('compose/',views.VideoCreateView.as_view(),name='new'),
    path('video/<str:slug>/',views.VideoDetailView.as_view(),name='video_detail'),
]

如果需要更多代码,请在下面的评论中告诉我;我会用所需的信息更新我的问题。

在终端中,当我打印 JSON 响应时,显示的是:

{'error': {'code': 400, 'message': 'API key not valid. Please pass a valid API key.', 'errors': [{'message': 'API key not valid. Please pass a valid API key.', 'domain': 'global', 'reason': 'badRequest'}], 'status': 'INVALID_ARGUMENT'}},

但我输入的是正确的 YOUTUBE_API_KEY。在这里:

import requests
import urllib


YOUTUBE_API_KEY = 'AIzaSyBdeXR_2YF4***IIeywL08JSUm2zc*******'

这是 Videos.list API 端点在传递到无效的 API 键时产生的输出,如 URL 所示:

  1. key:
$ wget -qO- --content-on-error \
"https://www.googleapis.com/youtube/v3/videos?id=foobar&part=snippet&key="
{
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "errors": [
      {
        "message": "The request is missing a valid API key.",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
}
  1. keybarbaz:
$ wget -qO- --content-on-error \
"https://www.googleapis.com/youtube/v3/videos?id=foobar&part=snippet&key=barbaz"
{
  "error": {
    "code": 400,
    "message": "API key not valid. Please pass a valid API key.",
    "errors": [
      {
        "message": "API key not valid. Please pass a valid API key.",
        "domain": "global",
        "reason": "badRequest"
      }
    ],
    "status": "INVALID_ARGUMENT"
  }
}

要修复您的代码,请将您的 URL 字符串设置为:

f'https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id={video_id[0]}&key={YOUTUBE_API_KEY}'.

请注意 YOUTUBE_API_KEY.

周围的方括号和空格已被删除

这是 Videos.list API 端点在向其传递无效视频 ID 时产生的输出,如 URL 所示(假设参数值 key 是一个有效的 API 键):

$ wget -qO- --content-on-error \
"https://www.googleapis.com/youtube/v3/videos?id=foobar&part=snippet&key=..."
{
  "kind": "youtube#videoListResponse",
  "etag": "...",
  "items": [],
  "pageInfo": {
    "totalResults": 0,
    "resultsPerPage": 0
  }
}

请注意 items 数组是空的。这解释了您的代码获得的 IndexError 异常。

您的代码修复如下:

json = response.json()
items = json["items"]
assert len(items) <= 1
if len(items):
    title = items[0]["snippet"]["title"]
else:
    title = "N/A"

len(items) == 0 的情况下,您还可以生成某种错误消息;具有以下含义:给定 ID 引用的视频不存在。