Возникли проблемы при чтении переменной конфигурации Apache через wsgi в Django 1.11

Я пытаюсь прочитать настройки базы данных из конфигурации Apache и получаю сообщение об ошибке. Я пробовал много решений из других вопросов, но похоже, что это может быть проблема версии Django 1.11.

Это то, что у меня есть.

В httpd.conf:

<VirtualHost *:80>
    ....

    SetEnv DB_NAME XYZ
    SetEnv DB_USER abc

    ....
</VirtualHost>

В wsgi.py:

import os, sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR = os.path.abspath(os.path.join(BASE_DIR, '..'))

sys.path.append(PROJECT_DIR)

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()

env_variables_to_pass = ['DB_NAME', 'DB_USER', ]

def application(environ, start_response):
  for var in env_variables_to_pass:
    os.environ[var] = environ.get(var, '')
  return _application(environ, start_response)

В settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ['DB_NAME'],
        'USER': os.environ['DB_USER'],

         ......
        },
    }

И когда я запускаю свое приложение, я получаю "Внутреннюю ошибку сервера".

Вот что в apache_error.log:

[wsgi:error] raise KeyError(key) from None\r
[wsgi:error] KeyError: 'DB_NAME'\r

}

1 ответ

Решение

SetEnv устанавливает только значения словаря WSGI для каждого запроса, а не для обработки переменных среды. Вам необходимо установить переменные среды процесса из wsgi.py или из файла кода Python или файла конфигурации, обработанного как побочный эффект импорта wsgi.py подать в первый раз.

Единственное место в конфигурации системы для Apache, где вы можете установить переменные среды всего процесса, находится в envvars файл, но не все дистрибутивы Apache в системе Linux поддерживают это. Это также не рекомендуется, так как устанавливает их для всего Apache, а не для отдельных приложений, работающих под Apache.

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