Настройки 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 не должен быть пустым.

После некоторых исследований я получил следующее

  1. Если я поставлю print(os.getcwd()) внутри base.py я получаю /media/grimel/Home/project/ вместо /media/grimel/Home/project/project/settings/
  2. Этот код работает, только если я заменяю:
    key = "secrets.json"
    от
    key = "project/settings/secrets.json"

Лично мне не нравится это решение.
Итак, вопросы:

  1. Почему для base.py текущий рабочий каталог так запутан?
  2. Как лучше подходить к решению этой проблемы?

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 вообще в вашем файле настроек. Не забудьте добавить свой файл настроек в систему контроля версий.

Другие вопросы по тегам