Как засунуть client_secret и token в .env

Рейтинг: 0Ответов: 1Опубликовано: 30.01.2023

У меня есть код из квикстарта по работе с API гугла

def auth() -> Credentials:
    scopes = [
        'https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/spreadsheets'
    ]

    credentials = None

    if os.path.exists('token.json'):
        credentials = Credentials.from_authorized_user_file('token.json',
                                                        scopes)
    if not credentials or not credentials.valid:
        if credentials and credentials.expired and credentials.refresh_token:
            credentials.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'client_secret.json', scopes)
            credentials = flow.run_local_server(port=0)
        with open('token.json', 'w') as token:
            token.write(credentials.to_json())
    return credentials

Тут я получаю client_secret.json и token.json. Хотелось бы client_secret и token доставать из .env файла и, что важно, сохранять в .env файл. Проблема в том, что .from_authorized_user_file принимает файл, а в .env хранится словарь, типа client_secret={...}.

Как мне переписать этот код, чтобы все работало через .env?Встроенный метод .to_json() или дамп словаря в json не работает, он жалуется на файл, что логично

То есть так, чтобы я, например, мог импортировать конфигурацию, типа from config import config и передавать не файл, а сразу словарь config.token или config.client_secret.

Ответы

▲ 0Принят

Используй конструкторы Credentials.from_authorized_user_info и InstalledAppFlow.from_client_config в которых вместо имени файла передается мапинг с параметрами.

В .env положить json, yml, или ещё что

{
"client_config": ....,
"token":.....
}

или toml

client_config.foo = ...
client_config.bar = ...

token.access = ...
token.refresh = .... 

то как вы задумали не очень удобно читать из питона, а гонять в enviroment не безопасно.