3

我正在寻找解决方案,我无法将 /etc/profile 中定义的变量传递给 apache。

这是我要设置的内容:

我有一个 django 应用程序,我通过 WGSI 接口通过 Apache/Passenger (modrails) 部署它。

在我的 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) 如果我在此文件中强制使用viron['ENV'] = 'DEV',乘客需要一个passenger_wgsi.py 来注册您的应用程序,但我无法做到这一点

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 检索此名称,并根据名称设置我需要使用的变量。

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

4

2 回答 2

4

我将建议一个替代解决方案,因为我不知道如何解决您的具体问题。

创建多个 WSGI 文件。production.wsgi, dev1.wsgi, dev2.wsgi,等等。无论如何,test.wsgi每个网络服务器都必须配置。/path/to/.wsgi无论如何,wsgi 文件中只有极少量的代码,因此复制它并不是很昂贵。此外,您可以_base.wsgi提供所有公共值,并要求派生的 wsgis 调用application = wsgi.WSGIHandler().

我们项目中的每个开发人员都有自己的设置文件和 wsgi 文件,以启用篡改设置,而不会以流氓值破坏生产。

于 2011-02-13T21:06:19.137 回答
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/environments 这样的文件来实现它,并进行如下检查:# check if the file exists if os.path.isfile('/opt/environments'): os.environ['ENV'] = 'DEV' 其他:os.environ['ENV'] = 'PROD'

它本来可以让我执行相同的检查,但我必须告诉每个人创建文件。这取决于你想做什么来创建一个文件或将你的主机名添加到列表中,因为我们的项目在 SVN 下,对我来说,我们的 WSGI 文件的简单提交比创建文件更简单。

谢谢你。

于 2011-02-14T15:03:44.713 回答