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

Django-根据服务器从wsgi引用不同的设置文件,django,apache,mod-wsgi,web-deployment,Django,Apache,Mod Wsgi,Web Deployment,我很惊讶我找不到与此相关的现有问题。也许我忽略了一个显而易见的答案。但是,假设我有一个名为“foo”的django项目。本书鼓励在多个文件中定义foo的设置 Dev和prod是同一个repo的独立实例,它们都通过我的webpartion帐户使用Apache提供服务。对于开发站点,我希望它使用settings/dev.py,对于prod站点,我希望它使用settings/prod.py。我的wsgi.py文件包含以下行: os.environ.setdefault("DJANGO_SETTINGS

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

Dev和prod是同一个repo的独立实例,它们都通过我的webpartion帐户使用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文件中为正确的wsgi文件分配WSGIScriptAlias

wsgi/
    dev.py
    prod.py

谢谢

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

因此,只需尝试将环境变量
DJANGO_SETTINGS_MODULE
设置为开发系统中的“foo.SETTINGS.dev”和生产系统中的“foo.SETTINGS.prod”


setdefaul
只是将
DJANGO\u SETTINGS\u模块设置为默认值,以防您自己没有定义它-您可以注释掉它或忽略它。

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

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

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

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

您可以做的是使用应该在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)

感谢@Serafeim的快速准确回复。我已经为一些信息设置了环境变量,但没有意识到我也可以设置DJANGO_SETTINGS_模块。谢谢关于这方面的一些附加信息,我刚刚发现了这篇有用的文章:除了环境变量不能在mod_wsgi下轻松使用之外。使用setdefault()也容易出现问题,如感谢Graham分享此方法中所述!我已经阅读了你对@Serafeim答案的评论,但不明白为什么环境变量不能轻易使用b/c他的方法也适用于我。你的答案会更可取,有什么原因吗?Thx AGAINEEnvironment变量通常设置在正在执行的流程之外,以覆盖配置,我对2scoops中配方的理解在此基础上起作用。在Apache之外的上下文中使用Apache设置环境变量时,Apache使用的环境变量并不是那么简单,因为启动脚本并没有为您提供在Linux系统上实现这一点的简单方法。感谢您的解释,以及您博客的完整性。@GrahamDumpleton这不会创建对mod_wsgi的依赖吗?为什么开发人员在本地系统上工作时会创建所有这些守护进程进程组?在使用守护进程时,是否有任何方法可以在服务器和本地计算机上使用相同的wsgi文件。也许类似于从ValualEnvrPrPress的PASScript中设置环境变量,但这对于多个站点来说是行不通的。如果导入失败或mod_wsgi.process\u组不在那里,您就知道您实际上没有在mod_wsgi下运行。
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)