Как засунуть client_secret и token в .env
У меня есть код из квикстарта по работе с 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
Ответы (1 шт):
Используй конструкторы
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 не безопасно.