/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 所示:
- 空
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"
}
}
key
是 barbaz
:
$ 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 引用的视频不存在。
我正在使用 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 所示:
- 空
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"
}
}
key
是barbaz
:
$ 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 引用的视频不存在。