Django + mod_wsgi。 从Apache的SetEnv中设置OS环境variables

我需要分割Django的开发和生产设置。 我决定,如果USKOVTASK_PRODvariables设置,那么应用程序应该使用生产设置。 我读这篇文章,并试图做到这一点。

我的片段:

/etc/apache2/sites-enabled/uskovtask.conf:

 <VirtualHost *:80> ServerName uskovtask.*.com ServerAlias uskovtask.*.com DocumentRoot /mnt/ebs/uskovtask Alias /static /mnt/ebs/uskovtask/static/ <Directory /mnt/ebs/uskovtask/static> Require all granted </Directory> #WSGIPythonPath /mnt/ebs/uskovtask WSGIDaemonProcess uskovtask.*.com python-path=/mnt/ebs/uskovtask:/usr/lib/python2.7/site-packages WSGIProcessGroup uskovtask.*.com WSGIScriptAlias / /mnt/ebs/uskovtask/uskovtask/wsgi.py SetEnv USKOVTASK_PROD 1 <Directory /mnt/ebs/uskovtask/uskovtask> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost> 

wsgi.py:

 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "uskovtask.settings") from django.core.wsgi import get_wsgi_application _application = get_wsgi_application() def application(environ, start_response): if 'USKOVTASK_PROD' in environ: os.environ.setdefault('USKOVTASK_PROD', environ['USKOVTASK_PROD']) return _application(environ, start_response) 

settings.py的一部分:

 import os if 'USKOVTASK_PROD' in os.environ: from settings_prod import * else: from settings_dev import * 

但是它总是导入settings_dev的设置。 为什么?

这与从Django wsgi.py文件访问Apache SetEnv变量的问题有关

正如答案所述,您需要继承WSGIHandler。

正如Graham Dumpleton在第二个答案中解释的那样,

这一切都说,你提到的博客文章通常不会帮助。 这是因为它使用在每个请求上设置进程环境变量的令人讨厌的技巧,根据每个请求使用Apache中的SetEnv设置WSGI环境设置。 如果环境变量的值根据URL上下文可能有所不同,这可能会导致多线程配置中的各种问题。 对于Django来说,这并没有什么帮助,因为在处理任何请求之前,通常会导入Django设置模块,这意味着在需要的时候环境变量将不可用。

我想这就是你的情况。

我通过改变wsgi.py来解决这个问题:

 from django.core.handlers.wsgi import WSGIHandler import django import os class WSGIEnvironment(WSGIHandler): def __call__(self, environ, start_response): os.environ['USKOVTASK_PROD'] = environ['USKOVTASK_PROD'] os.environ.setdefault("DJANGO_SETTINGS_MODULE", "uskovtask.settings") django.setup() return super(WSGIEnvironment, self).__call__(environ, start_response) application = WSGIEnvironment()