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 предлагает решение. Я выполнил следующие шаги:

  1. установите python-dotenv с помощью pip.
  2. создайте файл ".env" в корневом каталоге моего проекта.
  3. добавьте в .env параметр конфигурации, например: SECRET_KEY=mysecretkeyval
  4. в моем settings.py файле include from dotenv import load_dotenv
  5. в файле settings.py вызовите load_dotenv()
  6. в settings.py, установите переменную приложения: SECRET_KEY = os.environ.get('SECRET_KEY').

Это решение отлично работает, но если я получу более конкретную информацию о настройке (или не настройке) переменных env в wsgi.py, я обновлю свой ответ.

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