首页 > 解决方案 > 如何在 Apache 站点配置中为 Django 指定环境变量?

问题描述

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

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

我找不到太多关于如何做到这一点的信息。我发现这篇旧博客文章建议我可以使用 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组件仍然受支持,并且我已确认它已在我的服务器上安装并启用。

标签: djangoapachemod-wsgi

解决方案


问题是我打电话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)

推荐阅读