Как кешировать авторизацию для Google Sheets с помощью gspread? - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь создать простую функцию, которая отправляет некоторые данные в электронную таблицу Google Sheets. Я размещаю эту функцию в AWS Lambda. В любом случае, код выглядит примерно так:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = [
    'https://spreadsheets.google.com/feeds',
    'https://www.googleapis.com/auth/drive'
]
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    'my_creds.json', scope
)
gc = gspread.authorize(credentials)

Это работает отлично, но, к сожалению, процесс довольно медленный. Кажется, что большая часть времени уходит на авторизацию. Поэтому мой вопрос заключается в следующем: есть ли способ авторизовать и сохранить объект авторизации и повторно использовать его для следующих нескольких запросов? Когда срок действия истекает, функция может снова его авторизовать. Любая помощь с благодарностью!

1 Ответ

1 голос
/ 03 февраля 2020
  • Вы не хотите запускать процесс авторизации при каждом запуске.
  • Вы хотите сохранить данные авторизации в файл и использовать загрузку, загружая их.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

В этом ответе информация о токене, включая токен доступа, сохраняется в виде файла. Потому что срок действия токена доступа составляет 3600 секунд. Это используется.

Поток:

Последовательность ответов:

  1. Проверьте файл токена, включая данные авторизации.
    • Если файл НЕ существует, токен доступа извлекается процессом авторизации и сохраняет информацию о токене в файле токена.
    • Если файл существует и время ограничения превышает текущее время используется токен доступа, полученный из файла токена.
    • Если файл существует, а время ограничения меньше текущего времени, токен доступа извлекается в процессе авторизации и сохраняет токен информация в файл токена.
  2. Использовать gspread с токеном доступа.

В этом потоке процесс авторизации выполняется каждые 1 час вместо каждого запустите.

Пример сценария:

Перед запуском сценария измените переменные token_file и credential_file.

import datetime
import gspread
import json
import os
from oauth2client.service_account import ServiceAccountCredentials
from oauth2client.client import AccessTokenCredentials


token_file = "./access_token.txt"  # token file including the authorization data
credential_file = "###credential file of service account###"
now = int(datetime.datetime.now().timestamp())


def getNewAccessToken():
    scope = ['https://www.googleapis.com/auth/spreadsheets']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_file, scope)
    gc = gspread.authorize(credentials)
    token_response = gc.auth.token_response
    token_response['limitTime'] = token_response['expires_in'] + now - 300
    with open(token_file, mode='w') as f:
        json.dump(token_response, f)
    return token_response['access_token']


def getCredential():
    access_token = ""
    if os.path.exists(token_file):
        with open(token_file) as f:
            token = json.load(f)
        access_token = token['access_token'] if token['limitTime'] > now else getNewAccessToken()
    else:
        access_token = getNewAccessToken()
    return AccessTokenCredentials(access_token, None)


# Use gspread
credentials = getCredential()
gc = gspread.authorize(credentials)
  • . В скрипте время ограничения токена доступа установлено равным 3600 - 300 секунд. Поскольку, если время ограничения установлено в 3600 секунд, во время выполнения сценария может возникнуть ошибка авторизации.

Ссылка:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, прошу прощения.

...