Django - не удается передать переменную среды Apache/Passenger в интерфейсе WSGI

Я ищу решение, я не могу передать apache переменную, определяемую в /etc/profile.

Вот что я пытаюсь установить:

У меня есть приложение django, которое я развертываю через Apache/Passenger (modrails) через интерфейс WGSI.

В моем settings.py я использую эту команду Python: ENVIRONMENT = os.getenv('ENV', 'PROD'), поэтому, если переменная ENVIRONMENT не определена, она по умолчанию переходит к производственным настройкам.

Это помогает мне управлять тем, к какой БД я подключаюсь, и активировать инструменты отладки.

Он работает в производстве, потому что это значения по умолчанию, когда я нахожусь на сервере DEV, я не могу получить переменную среды из /etc/profile.

Он находится на сервере Ubuntu 10.04.

Итак, вот какой тест я сделал:

1) поместить в /etc/profile -> ENV='DEV' экспортировать ENV

2) в /etc/profile.d/environment.sh -> #!/bin/sh ENV='DEV' экспортировать ENV

3) в моем конфигурационном файле виртуального хоста -> PassEnv ENV

4) все еще в моем файле конфигурации виртуального хоста -> SetEnv ENV DEV

5) пассажир требует, чтобы пассажир_wgsi.py зарегистрировал ваше приложение, если я заставлю этот файл viron['ENV'] = 'DEV', это сработало, но я не могу этого сделать

ENVIRONMENT = os.getenv('ENV', 'PROD')
os.environ['ENV'] = ENVIRONMENT

Любая идея, почему или как я могу это исправить? Спасибо!





@Джош

Спасибо за ответ. Но у меня все еще есть некоторые вопросы.

С Passenger единственное, что мне нужно было установить в файле виртуального хоста, — это расположение общей папки внутри моего приложения python/django. Таким образом, мой файл виртуального хоста будет выглядеть так.

DocumentRoot path_to_my_public_folder # /home/user/workspace/myapp/public

Затем в папке myapp находится файлpassage_wsgi.py.

которые очень мало определяют, как вы сказали:

import sys, os
sys.path.append(os.getcwd())

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

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

и после этих настроек приложение заработало. Так что, возможно, я упустил ваше указание, когда вы говорите, что мы должны указать, какой файл wsgi мы использовали. Я думал, что он напрямую найдет пассажира_wsgi.py и загрузит его по умолчанию, что, похоже, он и делает в данный момент.

Еще одна вещь, которую вы должны знать, это то, что наш проект находится в репозитории SVN, и я хочу настроить этот файл для многих пользователей, чтобы у нас не было разных настроек.

Но то, что я проверю завтра, — это идея иметь один базовый файл wsgi с общей информацией и на основе имени хоста компьютера, из которого я буду импортировать другие настройки, такие как dev_wsgi.py или prod_wsgi.py.

Я должен иметь возможность получить это имя с помощью python и на основе имени я установлю переменные, которые мне нужно использовать.

Спасибо за идею, это очень ценно.


person DoRivard    schedule 13.02.2011    source источник
comment
Извините, но я раньше не работал с Passenger. Мой единственный опыт связан с Apache, и нам нужно определить /path/to/production.wsgi в httpd.conf. Похоже, вы идете по правильному пути, если переменная env все еще не работает.   -  person Josh Smeaton    schedule 14.02.2011


Ответы (2)


Я собираюсь предложить альтернативное решение, так как понятия не имею, как решить вашу конкретную проблему.

Создайте несколько файлов WSGI. production.wsgi, dev1.wsgi, dev2.wsgi, test.wsgi и т. д. В любом случае каждый веб-сервер должен быть настроен с /path/to/.wsgi. В любом случае, в файле wsgi содержится минимальное количество кода, поэтому его копирование не очень дорого. Кроме того, вы можете иметь _base.wsgi для предоставления всех общих значений и требовать, чтобы производный wsgis вызывал application = wsgi.WSGIHandler().

У каждого разработчика в нашем проекте есть свои собственные файлы настроек и файлы wsgi, позволяющие изменять настройки без возможности прерывания производства с помощью мошеннического значения.

person Josh Smeaton    schedule 13.02.2011
comment
@ Джош - Спасибо за ответы. Я обновил свои вопросы, и я дам больше информации о тестировании завтра утром. - person DoRivard; 14.02.2011
comment
Я добавил ответ с моим окончательным решением, и на данный момент он работает хорошо. Так что спасибо за открытие моего разума. Дом - person DoRivard; 14.02.2011

Наконец-то я заставил его работать, и я предоставлю способ, которым я это понял после предложения @Josh.

Вот как сейчас выглядит мой файл WSGI:

import sys, os

sys.path.append(os.getcwd())
# this allows us to run the project under Passenger on our workstation
# it is simply a list of all the developers machine hostname it can be expended as we want
LIST_OF_DEV_HOSTNAME = ['PC1', 'PC2','PC3',]
# Return the current machine hostname
HOSTNAME = os.uname()[1]

# Import Django app module
if HOSTNAME in LIST_OF_DEV_HOSTNAME:
    # here if it is not detected you can append to your python path the root folder of your django app
    sys.path.append('/home/user/workspace/django-app')
    # As previously mentioned I use an Environment Variable in the settings.py to switch DB and debug settings
    # so here I set the ENV variable I use in the settings.py to reflect the Development environment
    os.environ['ENV'] = 'DEV'
else:
    # we could append any other needed path in here too
    sys.path.append('/any/other/folder')
    # As previously mentioned I use an Environment Variable in the settings.py to switch DB and debug settings
    # so here I set the ENV variable I use in the settings.py to reflect the Development environment
    os.environ['ENV'] = 'PROD'

# Shared between the two environments    
sys.path.append('/usr/lib/python2.4/site-packages/')

# Import the django app settings and Environment variable
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

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

Вот так я и научился тренироваться.

Я также мог добиться этого, создав такой файл, как /opt/environments, и сделал проверку следующим образом: # проверить, существует ли файл if os.path.isfile('/opt/environments'): os.environ['ENV'] = 'DEV' иначе: os.environ['ENV'] = 'PROD'

это позволило бы мне выполнить ту же проверку, но мне пришлось бы сказать всем, чтобы они создали файл. Это зависит от того, что вы хотите сделать, создать файл или добавить свое имя хоста в список, поскольку наш проект находится под SVN, простая фиксация нашего файла WSGI для меня проще, чем создание файла.

Спасибо.

person DoRivard    schedule 14.02.2011