我需要拆分Django的开发和生产设置。我决定如果设置了USKOVTASK_PROD
变量,那么app应该使用生产设置。我阅读了this文章并试图这样做。
我的片段:
/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的设置。为什么呢?
答案 0 :(得分:7)
我通过将 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()
答案 1 :(得分:6)
这与问题Access Apache SetEnv variable from Django wsgi.py file
有关你需要继承WSGIHandler,如答案所示。
Graham Dumpleton在第二个答案中解释说,
所有人都说,你提到的博客文章通常不会有帮助。这个 是因为它正在使用设置过程的讨厌技巧 每个请求的环境变量基于每个请求WSGI 在Apache中使用SetEnv设置的环境设置。这可能导致各种各样 多线程配置中的问题,如果的值 环境变量可以根据URL上下文而有所不同。对于的情况 Django,它没有用,因为Django设置模块会 通常在处理任何请求之前导入,这意味着 环境变量当时不可用 必需的。
我觉得这就是你的情况。