Как избежать размещения переменных окружения в нескольких местах с помощью Django, nginx и uWSGI?

Я пытаюсь настроить nginx + uWSGI для обслуживания моего приложения Django.

Когда я помещал переменные среды в myapp_uwsgi.ini:

uid = username
gid = username
env = DJANGO_SITE_KEY="..."

работает как ожидалось.

Однако у моего приложения есть несколько команд управления, которые также должны иметь доступ к переменным среды, которые я определил.

Если я поместил переменные среды в /home/username/.bashrc:

export DJANGO_SITE_KEY="..."

uWSGI не загружает их.

Я попытался поместить переменные среды в отдельный файл:

#!/bin/sh
export DJANGO_SITE_KEY="..."

а затем вызовите его как из .bashrc:

. /home/username/environment

и myapp_uwsgi.ini:

exec-pre-app = . /home/username/environment

В журналах uWSGI я вижу эту строку:

running ". /home/username/environment" (pre app)...

Но мое приложение Django не может получить доступ к переменным среды с помощью os.environ.

Я также попытался поместить команды export в hook preactivate virtualenvwrapper и использовать параметр virtualenv = uWSGI, но он тоже не работает (я полагаю, что крючки выполняются только при использовании команд virtualenvwrapper, таких как workon.

Ответ 1

Вот ответ от разработчиков uWSGI:

просто поместите каждую из них (по одной в строке) в текстовый файл в форме

VAR = VALUE

затем в конфигурации uWSGI

[uwsgi]
for-readline = yourfile
  env = %(_)
endfor =

Это также работает с конфигурационными файлами yml:

  for-readline: filename
    env: %(_)
  endfor:

Ответ 2

Я использую django-dotenv. Поместите свои env vars в файл как .env внутри вашего проекта, а затем загрузите его в manage.py и wsgi.py. Никакой другой конфигурации не требуется. Команды uwsgi и manage.py будут работать, как ожидалось, и все ваши env vars хранятся только в одном файле.

Ответ 3

Другим подходом является использование систем управления конфигурацией, таких как Salt или Ansible.

С их помощью можно создать шаблоны Jinja для uWSGI и Django с {{variables}}, определенными в одном месте.