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

gyz*_*unk 5 apache django mod-wsgi wsgi

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

Django文档演示了如何对具有不同的WSGI应用程序文件实现这一点,但如果我们不希望创建一个专用的文件WSGI以及为我们不同的环境专用的设置文件,仅使用环境变量DJANGO_SETTINGS_MODULE中的Apache与SetEnv不sufficent .

该变量确实传递给application调用environ变量,但是django.conf检索这样的设置:

settings_module = os.environ[ENVIRONMENT_VARIABLE]
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*ton 7

由于只有一个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}
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)


gyz*_*unk 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)
Run Code Online (Sandbox Code Playgroud)

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

  • 像这样为每个请求设置环境变量实际上并不是一个好主意。它给人一种错误的印象,即“SetEnv”可以更改每个请求的值,但可以用于动态更改每个请求使用的设置(当它不能时)。 (2认同)