Django - 根据服务器从wsgi引用不同的设置文件

时间:2013-12-26 18:27:56

标签: django apache mod-wsgi web-deployment

我很惊讶我找不到与此相关的现有问题。也许有一个明显的答案,我忽略了。但是,让我说我的django项目名为“foo”。 foo的设置在Two Scoops书的鼓励下在多个文件中定义。

settings/
    local.py
    dev.py
    prod.py

Dev和prod是同一个repo的独立实例,这两个实例都是通过我的Webfaction帐户使用Apache提供的。对于开发站点,我希望它使用settings/dev.py,对于prod站点,我希望它使用settings/prod.py。我的wsgi.py文件包含以下行:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "foo.settings.prod")

这是我感到困惑的地方。如何使用foo.settings.dev加载开发网站?

我可以用多个文件替换wsgi.py,然后在每个httpd.conf文件中将WSGIScriptAlias分配给正确的wsgi文件吗?

wsgi/
    dev.py
    prod.py

由于

3 个答案:

答案 0 :(得分:7)

另一种方法是让每个站点在不同的mod_wsgi守护进程组中运行。将这些守护程序进程组命名为“local”,“dev”和“prod”。

在您的WSGI脚本文件中,您可以使用:

import mod_wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'foo.settings.%s' % mod_wsgi.process_group

换句话说,使用mod_wsgi守护程序进程组的名称来动态选择配置。

答案 1 :(得分:1)

如果我没记错的话,这两本书建议使用环境变量来设置各种设置 - 其中一个应该是django设置模块的位置。

因此,只需在开发系统中尝试设置和环境变量DJANGO_SETTINGS_MODULE等于“foo.settings.dev”,并在生产中尝试“foo.settings.prod”。

setdefaul只是将DJANGO_SETTINGS_MODULE设置为默认值,以防您自己未定义 - 您可以将其注释掉或忽略它。

答案 2 :(得分:0)

您可以使用wsgi文件路径中应该选择的设置名称。 假设您的wsgi的路径是/www/production/django_project_name/wsgi.py,那么您可以在该文件中执行以下操作:

import os
import re

match = re.match('/www/(\w+)/.+', os.path.realpath(__file__))
environment = match.group(1)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings." + environment)