Django + mod_wsgi.从Apache的SetEnv设置OS环境变量

mic*_*kov 10 python apache django mod-wsgi

我需要拆分Django的开发和生产设置.我决定如果USKOVTASK_PROD设置了变量,那么app应该使用生产设置.我读了这篇文章并试图这样做.

我的片段:

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

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

settings.py的部分:

import os

if 'USKOVTASK_PROD' in os.environ:
    from settings_prod import *
else:
    from settings_dev import *
Run Code Online (Sandbox Code Playgroud)

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

mic*_*kov 8

我通过将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()
Run Code Online (Sandbox Code Playgroud)


iam*_*ush 7

这与Django wsgi.py文件中的Access Apache SetEnv变量有关

正如答案所说,你需要继承WSGIHandler.

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

总而言之,您提到的博客文章通常不会有所帮助.这是因为它正在使用令人讨厌的技巧,即根据在Apache中使用SetEnv设置的每个请求WSGI环境设置在每个请求上设置进程环境变量.如果环境变量的值可能因URL上下文而异,则可能会在多线程配置中导致各种问题.对于Django的情况,它没有用,因为Django设置模块通常会在处理任何请求之前导入,这意味着环境变量在所需的时间不可用.

而且我认为这就是你的情况.