Проблема доступа к переменной среды Google API в Heroku - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь авторизовать Google Sheets в некотором коде Python, развернутом в Heroku.Моя учетная запись службы Google хранится в Heroku как переменная среды.

credentials = environ['GOOGLE_APPLICATION_CREDENTIALS']
gc = pygsheets.authorize(service_file=credentials)

Однако при запуске сценария в Heroku появляется ошибка.

FileNotFoundError: [Errno 2] No such file or directory:

Затем следуетвесь дамп JSON моей переменной GOOGLE_APPLICATION_CREDENTIALS.

'{\n  "type": "service_account", [...] gserviceaccount.com"\n}'

Это прекрасно работает локально на моем компьютере, когда у меня есть файл JSON в папке проекта.

Вот полная трассировка, приводящая к ошибке FileNotFoundError:

Трассировка (последний вызов был последним): файл "code.py", строка 27, в gc = pygsheets.authorize (service_file = учетные данные) Файл "/app/.heroku/python/lib/python3.7/site-packages/pygsheets/authorization.py", строка 111, в поле authorize credentials = service_account.Credentials.from_service_account_file (service_account_file, scopes = scopes = scopes = scopes)Файл "/app/.heroku/python/lib/python3.7/site-packages/google/oauth2/service_account.py", строка 209, в файле from_service_account_file, require = ['client_email', 'token_uri']) File "/app/.heroku/python/lib/python3.7/site-packages/google/auth/_service_account_info.py ", строка 71, в from_filename с io.open (имя файла, 'r', кодировка = 'utf-8') как json_file:

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

@ 24hourbreakfast Между прочим, я только что добавил поддержку credentials-via-env-var в библиотеку pygsheets:

https://github.com/nithinmurali/pygsheets/pull/345

Не уверен, когда он сделает следующий выпуск, надеюсь.в ближайшее время.

0 голосов
/ 08 марта 2019

Наконец понял.

Необходимо преобразовать переменную среды в JSON с помощью json.loads, , а затем записать это в файл JSON с помощью json.dump.Это связано с тем, что pydrive принимает учетные данные службы только в виде файла JSON, а переменные Heroku env фактически не хранятся в формате JSON, даже если они созданы из файла JSON.

#AUTHENTICATE
gauth = GoogleAuth()
scope = ['https://www.googleapis.com/auth/drive']
creds = json.loads(os.environ.get('GOOGLE_APPLICATION_CREDENTIALS'))
with open('gcreds.json', 'w') as fp:
    json.dump(creds, fp)
gauth.credentials = 
ServiceAccountCredentials.from_json_keyfile_name('gcreds.json', scope)
drive = GoogleDrive(gauth)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...