Django не удается обновить переменную окружения из wsgi.py
У меня есть приложение Django, которое использует Apache в производстве. Я храню значение секретного ключа Django во внешнем файле, из которого ключ применяется при запуске. Я сообщаю Apache местоположение файла с помощью директивы SetEnv в конфигурационном файле моего приложения:
SetEnv DJANGO_KEY_LOC /data/www/ref/.myKey
Я написал функцию в wsgi.py для получения пути из переменной Apache env и применения значения ключа внутри к настройке SECRET_KEY в settings.py. Если код не находит эту переменную, он берет путь из переменной os env, которую я использую для dev DJANGO_KEY='/data/www/ref/.myKey
:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myApp.settings')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myApp.settings'
_application = get_wsgi_application()
def application(environ, start_response):
try:
# DJANGO_KEY_LOC set in Apache conf for prod.
file_loc = environ['DJANGO_KEY_LOC']
with open(file_loc, 'r') as f:
os.environ['SECRET_KEY'] = f.read()
except KeyError:
# if key missing in environ try dev settings
print('running in dev environment...')
dev_file_loc = os.getenv('DJANGO_KEY')
with open(dev_file_loc, 'r') as f:
os.environ['SECRET_KEY'] = f.read()
return _application(environ, start_response)
Функция прекрасно извлекает значения ключей, но не может установить os.environ['SECRET_KEY']. Код в settings.py выглядит так SECRET_KEY = os.environ['SECRET_KEY']
. Приложение не загружается, если я заранее не задам фиктивное значение для SECRET_KEY, но фиктивное значение никогда не изменяется. Я проверил код set/get извне в моем интерпретаторе python, и он работал нормально. Какую часть получения и установки переменных окружения внутри Django я упустил?
Я пока не могу полностью объяснить, почему мой вышеприведенный код не может установить переменные окружения, но сторонняя библиотека python-dotenv предлагает решение. Я выполнил следующие шаги:
- установите python-dotenv с помощью pip.
- создайте файл ".env" в корневом каталоге моего проекта.
- добавьте в .env параметр конфигурации, например:
SECRET_KEY=mysecretkeyval
- в моем
settings.py
файле includefrom dotenv import load_dotenv
- в файле settings.py вызовите
load_dotenv()
- в settings.py, установите переменную приложения:
SECRET_KEY = os.environ.get('SECRET_KEY')
.
Это решение отлично работает, но если я получу более конкретную информацию о настройке (или не настройке) переменных env в wsgi.py, я обновлю свой ответ.