Django - Не могу передать переменную среды Apache / Passenger через интерфейс WSGI - PullRequest
2 голосов
/ 13 февраля 2011

Я ищу решение, я не могу передать 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' export ENV

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

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

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

5) пассажир требует в файле passenger_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 есть файл passenger_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 мы использовали.Я подумал, что он непосредственно найдет passenger_wsgi.py и загрузит его по умолчанию, что он сейчас делает.

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

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

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

СпасибоВы за идею, это хорошо ценить.

Ответы [ 2 ]

4 голосов
/ 14 февраля 2011

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

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

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

0 голосов
/ 14 февраля 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 / environment, и сделал проверку следующим образом: # проверить, существует ли файл, если os.path.isfile ('/ opt / environment'): os.environ ['ENV'] = 'DEV' else: os.environ ['ENV'] = 'PROD'

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

Спасибо.

...