Почему 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.

Вернуться на верх