如何在Django的Apache网站配置中指定环境变量?

时间:2018-07-19 19:53:00

标签: django apache mod-wsgi

如何为Apache站点指定环境变量?

我有一个由Apache + ModWSGI服务的多租户Django网站。每个站点使用相同的Django代码,但是它们的设置略有不同。一个环境变量告诉Django要加载哪些设置。当前,我正在获得一个单独的wsgi_<site_name>.py文件,其中包含适用于每个站点的变量,但这违反了DRY规则。相反,我想将此变量放在Apache网站配置中,并为所有网站使用单个wsgi.py文件。

我找不到有关如何执行此操作的太多信息。我发现这个one old blog post暗示我可以使用Apache配置语法:

SetEnv SITE somename

以及类似以下的wsgi文件:

import os, sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR = os.path.abspath(os.path.join(BASE_DIR, '..'))

sys.path.append(PROJECT_DIR)
os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings'

from django.core.wsgi import get_wsgi_application
_application = get_wsgi_application()

def application(environ, start_response):
  os.environ['SITE'] = environ['SITE']
  return _application(environ, start_response)

但这无效。如果我打印出SITE变量,则Django将永远不会收到值“ somename”并显示默认值。

据我所知mod_env组件仍受支持,并且我已经确认服务器上已安装并启用了该组件。

1 个答案:

答案 0 :(得分:0)

问题是我打电话给get_wsgi_application()太早了。正确的代码是:

from django.core.wsgi import get_wsgi_application

def application(environ, start_response):
    os.environ['SITE'] = environ['SITE']
    _application = get_wsgi_application()
    return _application(environ, start_response)