Flask 谷歌Api客户端-AttributeError:';str';对象没有属性';授权';

Flask 谷歌Api客户端-AttributeError:';str';对象没有属性';授权';,flask,docker-compose,youtube-api,google-api-client,Flask,Docker Compose,Youtube Api,Google Api Client,我的代码一直在运行,直到我决定将我的Google Api凭据移动到Docker环境中。我使用Flask作为web服务器框架 这是我的设置: 码头工人: docker-compose-dev.yml environment: - FLASK_ENV=development - APP_SETTINGS=project.config.DevelopmentConfig - GOOGLE_APPLICATION_CREDENTIALS=/usr/src/app/project/api/re

我的代码一直在运行,直到我决定将我的Google Api凭据移动到Docker环境中。我使用Flask作为web服务器框架

这是我的设置:

码头工人:

docker-compose-dev.yml

environment:
  - FLASK_ENV=development
  - APP_SETTINGS=project.config.DevelopmentConfig
  - GOOGLE_APPLICATION_CREDENTIALS=/usr/src/app/project/api/resources/youtube/urls/project-84a0ef4dcd33.json  
烧瓶:

config.py

 class DevelopmentConfig(BaseConfig):
    CREDENTIALS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"
from project.config import DevelopmentConfig

CREDENTIALS = DevelopmentConfig.CREDENTIALS
YOUTUBE_API_SERVICE_NAME = DevelopmentConfig.YOUTUBE_API_SERVICE_NAME
YOUTUBE_API_VERSION = DevelopmentConfig.YOUTUBE_API_VERSION

def youtube_id(track_name):
    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=CREDENTIALS,
    developerKey=None)

    search_response = youtube.search().list(
    q=track_name,
    part="id,snippet",
    ).execute()

    videos = []
    videos_ids = []
    channels = []
    playlists = []

    for search_result in search_response.get("items", []):
        if search_result["id"]["kind"] == "youtube#video":
            videos.append("%s (%s)" % (search_result["snippet"]["title"],
                                 search_result["id"]["videoId"]))
            videos_ids.append("%s" % (search_result["id"]["videoId"]))
        elif search_result["id"]["kind"] == "youtube#channel":
            channels.append("%s (%s)" % (search_result["snippet"]["title"],
                                   search_result["id"]["channelId"]))
        elif search_result["id"]["kind"] == "youtube#playlist":
            playlists.append("%s (%s)" % (search_result["snippet"]["title"],
                                    search_result["id"]["playlistId"]))

    return videos_ids[0]
video.py

 class DevelopmentConfig(BaseConfig):
    CREDENTIALS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"
from project.config import DevelopmentConfig

CREDENTIALS = DevelopmentConfig.CREDENTIALS
YOUTUBE_API_SERVICE_NAME = DevelopmentConfig.YOUTUBE_API_SERVICE_NAME
YOUTUBE_API_VERSION = DevelopmentConfig.YOUTUBE_API_VERSION

def youtube_id(track_name):
    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=CREDENTIALS,
    developerKey=None)

    search_response = youtube.search().list(
    q=track_name,
    part="id,snippet",
    ).execute()

    videos = []
    videos_ids = []
    channels = []
    playlists = []

    for search_result in search_response.get("items", []):
        if search_result["id"]["kind"] == "youtube#video":
            videos.append("%s (%s)" % (search_result["snippet"]["title"],
                                 search_result["id"]["videoId"]))
            videos_ids.append("%s" % (search_result["id"]["videoId"]))
        elif search_result["id"]["kind"] == "youtube#channel":
            channels.append("%s (%s)" % (search_result["snippet"]["title"],
                                   search_result["id"]["channelId"]))
        elif search_result["id"]["kind"] == "youtube#playlist":
            playlists.append("%s (%s)" % (search_result["snippet"]["title"],
                                    search_result["id"]["playlistId"]))

    return videos_ids[0]
现在我得到了以下错误:

AttributeError: 'str' object has no attribute 'authorize'

出了什么问题,我遗漏了什么?

docker
环境中设置的
project\uxxxxx.json
路径(“字符串”)必须传递到
service\u account.Credentials中。从\u service\u account\u file()

为清晰起见,请在config.py中更改变量名称:

PATH_TO_CREDENTIALS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
然后,将
service\u帐户导入您的video.py模块,如下所示:

from google.oauth2 import service_account
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=PASS_CREDENTIALS,
    developerKey=None)
以及:

最后,传递凭据,如下所示:

from google.oauth2 import service_account
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=PASS_CREDENTIALS,
    developerKey=None)
这会奏效的