почему django игнорирует некоторые переменные env, если я не передам их httpd при перезапуске? - PullRequest
0 голосов
/ 17 сентября 2011

Это среда моего приложения:

Redhat 6.0
Apache 2.2
Django 1.3.0
Python 2.6.6
cx_Oracle 5.1
mod_wsgi 3.2
Oracle DBMS 11.2 (on a different machine)

Выпуск: не удается получить доступ к моему веб-сайту django из веб-браузера, поскольку cx_Oracle не может получить дескриптор Oracle.

Тесты:

  1. запуск оболочки django-admin.py для запроса к db DOES WORK (запускается из сеанса bash с установленными переменными ORACLE_HOME и LD_LIBRARY_PATH)
  2. запуск собственного сценария, который добавляет ORACLE_HOME и LD_LIBRARY_PATH к os.environ и использует cx_Oracle для подключения к БД, без использования django DOES WORK (запускается из сеанса bash с установленными переменными ORACLE_HOME и LD_LIBRARY_PATH)
  3. запуск того же пользовательского скрипта с «sudo -u apache» НЕ работает
  4. запуск того же пользовательского сценария с "sudo -u env ORACLE_HOME = foo LD_LIBRARY_PATH = foo myscript.py" DOES WORK
  5. изменение django.db.backends.oracle.base.py, чтобы перед оператором Database.connect я печатал os.environ в файл, ПОКАЗЫВАЕТ, Я ИСПОЛЬЗУЛ ORACLE_HOME И LD_LIBRARY_PATH УСТАНОВЛЕНО
  6. явная установка ORACLE_HOME и LD_LIBRARY_PATH в os.environment внутри сценария adhoc django wsgi.py НЕ РАБОТАЕТ
  7. перезапуск httpd с помощью команды "sudo env ORACLE_HOME = foo LD_LIBRARY_PATH = foo /etc/init.d/httpd restart" РАБОТАЕТ

Мой вопрос: почему тест 7 отличается от тестов 2, 5, 6? Другими словами, почему я должен передавать env vars родительскому процессу httpd, а не просто устанавливать их в скриптах python / django?

1 Ответ

0 голосов
/ 18 сентября 2011

LD_LIBRARY_PATH должен находиться в среде до выполнения процесса.Загрузчик процесса выполнения прочитает его только один раз при запуске, и изменение значения среды после запуска процесса не имеет значения.Вот как все работает.

...