Настройки Django SECRET_KEY
У меня есть следующая структура моего проекта
project
--project
----settings
------base.py
------development.py
------testing.py
------secrets.json
--functional_tests
--manage.py
development.py и testing.py "наследуют" от base.py
from .base import *
Итак, где у меня проблемы
У меня есть SECRET_KEY для Django в secrets.json, который хранится в папке настроек
Я загружаю этот ключ как этот (видел это в "Два совка Джанго")
import json
from django.core.exceptions import ImproperlyConfigured
key = "secrets.json"
with open(key) as f:
secrets = json.loads(f.read())
def get_secret(setting, secret=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")
Но когда я бегу python manage.py runserver
Бла бла бла
django.core.exceptions.ImproperlyConfigured: параметр SECRET_KEY не должен быть пустым.
После некоторых исследований я получил следующее
- Если я поставлю
print(os.getcwd())
внутри base.py я получаю/media/grimel/Home/project/
вместо/media/grimel/Home/project/project/settings/
- Этот код работает, только если я заменяю:
key = "secrets.json"
отkey = "project/settings/secrets.json"
Лично мне не нравится это решение.
Итак, вопросы:
- Почему для base.py текущий рабочий каталог так запутан?
- Как лучше подходить к решению этой проблемы?
2 ответа
Рабочий каталог основан на том, как вы запускаете программу, в вашем случае python manage.py runserver
намекает на то, что ваш рабочий каталог содержит manage.py
, Помните, что это может отличаться при запуске в качестве сценария WSGI или иным образом, поэтому вам стоит использовать key = "project/settings/secrets.json"
является действительным.
Одним из решений является использование значения __file__
в base.py
, вероятнее всего "project/settings/base.py"
, Я бы использовал что-то вроде
import os
BASE_DIR = os.path.dirname(__file__)
key = os.path.join(BASE_DIR, "secrets.json")
Чтобы сделать жизнь проще, почему бы не двигаться secrets.json
к корню вашего проекта и ссылки
import os
key = os.path.join(BASE_DIR, "secrets.json")
непосредственно. Это не зависит от платформы, избавляя вас от необходимости переопределять BASE_DIR
вообще в вашем файле настроек. Не забудьте добавить свой файл настроек в систему контроля версий.