2011-02-13 66 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文件的简单提交对我来说比创建文件更简单。

谢谢。

相关问题