Почему Django не может найти файл secrets.json?
Итак, у меня есть мой проект Django, и я пытаюсь развернуть его через сервер heroku. Я понял, что мне нужно создать файл secrets.json (в той же директории, что и manage.py), а затем добавить его в .gitignore, для безопасности. Но после развертывания проекта я получил ошибку, говорящую о том, что не удалось найти файл secrets.json. Ниже приведен мой код.
settings.py
secret_file = os.path.join(BASE_DIR, 'secrets.json')
with open(secret_file) as f:
secrets = json.loads(f.read())
def get_secret(setting, secrets=secrets):
try:
return secrets[setting]
except KeyError:
error_msg = "Set the {} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
SECRET_KEY = get_secret("SECRET_KEY")
secrets.json
{
"SECRET_KEY" : xxx,
"EMAIL_HOST_USER" : xxx,
"EMAIL_HOST_PASSWORD" : xxx
}
Сохранив их, я добавил secrets.json к .gitignore.
Но в строке 2 (with open(secret_file) as f:) возникает ошибка, говорящая о том, что не удается найти файл secrets.json. Как вы думаете, в чем проблема?
*К вашему сведению, BASE_DIR не кажется проблемой, так как в других местах он работает нормально. Например, STATICFILES_DIRS.
Вы правильно делаете, что игнорируете файл secrets. Он не должен быть частью вашего репозитория, и его не следует отправлять в Heroku. Поскольку этот файл не включен в ваш исходный код, Heroku не может открыть его.
Наличие secrets.json не является распространенным шаблоном, по крайней мере, в мире Django / Python.
Меня немного смущает следующее:
def get_secret(setting, secrets=secrets):
try:
return secrets[setting]
except KeyError:
error_msg = "Set the {} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
Ваш обработчик KeyError обращается к переменным окружения. Это правильный путь! Настройка приложения с помощью переменных окружения является распространенной схемой.
Но JSON-файл с именем secrets.json не является переменной окружения. Более распространенным подходом будет загрузка значений в файл настроек непосредственно из окружения:
import os
SECRET_KEY = os.getenv("SECRET_KEY")
# You can even provide a default in case the environment variable isn't set:
ANOTHER_SETTING = os.getenv("ANOTHER_SETTING, default="some-default-value")
На Heroku вы можете установить config vars, которые будут автоматически внедрены в ваше окружение:
heroku config:set SECRET_KEY=some-value
Остается локальная разработка. Существует несколько способов установить переменные окружения на локальной машине, но самый распространенный - создать файл под названием .env:
SECRET_KEY=xxx
EMAIL_HOST_USER=xxx
EMAIL_HOST_PASSWORD=xxx
Если вы запускаете код локально через heroku local, он автоматически подхватит ваш .env файл. <<<Так же как и Pipenv, если вы используете его. Есть также python-dotenv и direnv и др.
Файлы
.env стали чем-то вроде стандарта де-факто, и вы с гораздо большей вероятностью найдете инструменты, поддерживающие их, чем те, которые поддерживают файлы secrets.json.