使用Apache WSGI通过DJANGO_SETTINGS_MODULE环境变量设置Django设置文件

时间:2014-08-25 15:11:04

标签: django apache mod-wsgi wsgi

如何在Apache WSGI仅使用DJANGO_SETTINGS_MODULE环境变量启动时更改Django使用的设置文件?

Django documentation显示了如何使用不同的WSGI应用程序文件实现此目的,但如果我们不想为我们的不同环境创建专用的WSGI文件以及专用的设置文件,则仅使用环境变量<{1}}在Apache中的DJANGO_SETTINGS_MODULE是不够的。

该变量确实传递给SetEnv变量application调用,但environ检索如下设置:

django.conf

它永远不会看到正确的变量。

2 个答案:

答案 0 :(得分:6)

由于只有一个Django应用程序实例可以在Python子解释器的上下文中运行,因此使用mod_wsgi执行操作的最佳方法是将需要不同设置的每个不同的Django站点专用于不同的mod_wsgi守护程序进程基。

在执行此操作时,请使用mod_wsgi守护程序进程组的名称,该名称反映应使用的设置文件的名称,然后在WSGI脚本文件的全局范围内,根据名称设置DJANGO_SETTINGS_MODULE mod_wsgi守护程序进程组。

Apache配置因此具有:

WSGIDaemonProcess mysite.settings_1
WSGIDaemonProcess mysite.settings_2

WSGIScriptAlias /suburl process-group=mysite.settings_2 application-group=%{GLOBAL}
WSGIScriptAlias / process-group=mysite.settings_1 application-group=%{GLOBAL}

和WSGI脚本文件:

import os
try:
    from mod_wsgi import process_group
except ImportError:
    settings_module = 'mysite.settings'
else:
    settings_module = process_group

os.environ['DJANGO_SETTINGS_MODULE'] = settings_module

答案 1 :(得分:0)

要实现这一点,您可以在应用程序的wsgi.py文件中使用以下代码:

import os
from django.core.wsgi import get_wsgi_application

def application(environ, start_response):
    _application = get_wsgi_application()
    os.environ['DJANGO_SETTINGS_MODULE'] = environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
    return _application(environ, start_response)

提示:不要忘记自定义myapp.settings字符串以匹配您的默认设置模块。