2011-02-13 71 views
2

我正在尋找解決方案,我無法將/ apache變量定義傳遞給/ etc/profile。Django - 無法將環境變量傳遞給WSGI接口上的Apache/Passenger

這裏是我想設置:

我有我通過Apache /乘客(modrails)通過WGSI接口部署Django應用程序。

在我的settings.py我使用這條巨蟒的命令: 環境= os.getenv(「ENV」,「PROD」) 所以如果環境變量沒有定義它在默認情況下進入到生產設置。

這幫助我管理哪些數據庫連接並激活調試工具。

它在生產中工作,因爲它是默認值,當我在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)乘客要求passenger_wgsi.py註冊您的應用程序,如果我在這個文件中 病毒粒子[ 'ENV' 逼] =「DEV」這走了一個工作,但我不能做到這一點

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

任何想法,爲什麼或如何解決這個問題? 謝謝!





@Josh

感謝您的答覆。但我仍然有一些問題。

使用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存儲庫中,我想爲許多用戶設置這個文件,所以我們沒有不同的設置。

但我會測試tomorow是具有一個基本的WSGI文件與計算機的主機名的公共信息 和基礎,我會從像dev_wsgi.py導入其他設置或prod_wsgi.py的想法

我應該能夠檢索這個名稱與python和基於名稱我將設置我需要使用的變量。

謝謝你的想法,非常感謝。

+0

對不起,我以前沒有和Passenger一起工作過。我唯一的經驗是使用Apache,我們必須在httpd.conf中定義`/ path/to/production.wsgi`。聽起來就像你正朝着正確的軌道前進,如果env變量仍然不起作用。 – 2011-02-14 04:49:10

回答

4

因爲我不知道如何解決您的特定問題,所以我會提出一種替代解決方案。

創建多個WSGI文件。 production.wsgi,dev1.wsgi,dev2.wsgi,test.wsgi等。每個網絡服務器都必須配置/path/to/.wsgi。無論如何,wsgi文件中只有最少量的代碼,因此複製它並不是很昂貴。此外,您可以讓_base.wsgi提供所有常用值,並要求派生的wsgis調用application = wsgi.WSGIHandler()

我們項目上的每個開發人員都有自己的設置文件和wsgi文件,可以篡改設置,而無需使用惡意值破壞生產。

+0

@ Josh - 感謝我的回覆,我更新了我的問題,並且我會給更多的測試信息。 – DoRivard 2011-02-14 04:40:38

0

我終於搞定了,我會提供我在 @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 /環境文件來實現它,並做了檢查是這樣的: #檢查文件是否存在 如果os.path.isfile(「/選擇/環境」): OS 'ENV'] ='DEV' else: os.environ ['ENV'] ='PROD'

它會允許我執行相同的檢查,但是我必須告訴所有人創建文件。 這取決於你想要做什麼創建文件或將你的主機名添加到列表中,因爲我們的項目在SVN 之下,我們的WSGI文件的簡單提交對我來說比創建文件更簡單。

謝謝。

相關問題