【问题标题】:Django - Can't pass Environment Variable to Apache/Passenger on the WSGI InterfaceDjango - 无法在 WSGI 接口上将环境变量传递给 Apache/Passenger
【发布时间】:2011-02-13 18:52:25
【问题描述】:

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

这是我要设置的内容:

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

在我的 settings.py 中,我正在使用这个 python 命令: 环境 = os.getenv('ENV', 'PROD') 因此,如果未定义 ENVIRONMENT 变量,则默认情况下会进入生产设置。

这有助于我管理我连接到的数据库并激活调试工具。

它在生产中工作,因为它是默认值,当我在 DEV 服务器上时,我无法从 /etc/profile 获取环境变量。

它在 Ubuntu 10.04 服务器上

所以这是我做的一些测试:

1) 放入 /etc/profile -> 环境='开发' 导出 ENV

2) 在 /etc/profile.d/environment.sh -> #!/bin/sh 环境='开发' 导出 ENV

3) 在我的虚拟主机配置文件中 -> PassEnv ENV

4) 仍在我的虚拟主机配置文件中 -> SetEnv ENV DEV

5) 如果我强制在此文件中,乘客需要乘客 wgsi.py 来注册您的应用程序 viron['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 存储库中,并且 我想为很多用户设置这个文件,所以我们没有不同的设置。

但是我明天要测试的是拥有一个包含公共信息的基本 wsgi 文件的想法 并基于计算机的主机名,我将从 dev_wsgi.py 或 prod_wsgi.py 等导入其他设置

我应该能够用 python 检索这个名字,并根据这个名字设置我需要使用的变量。

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

【问题讨论】:

  • 抱歉,我之前没有和Passenger合作过。我唯一的经验是使用 Apache,我们必须在 httpd.conf 中定义/path/to/production.wsgi。如果 env 变量仍然不起作用,听起来你正朝着正确的方向前进。

标签: django apache2 environment-variables passenger setenv


【解决方案1】:

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

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

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

【讨论】:

  • @Josh - 感谢您的回复,我更新了我的问题,明天早上我会提供更多测试信息。
  • 我在最终解决方案中添加了答案,目前它运行良好。所以谢谢你打开我的心扉。多姆
【解决方案2】:

我终于让它工作了,我会提供我想出来的方式 @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 这样的文件来实现它,并像这样进行检查: # 检查文件是否存在 如果 os.path.isfile('/opt/environments'): os.environ['ENV'] = 'DEV' 别的: os.environ['ENV'] = 'PROD'

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

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2013-12-29
    • 2021-09-05
    • 2020-03-27
    • 2017-03-30
    相关资源
    最近更新 更多