我有两个不相关的mod_wsgi Django应用程序,它们需要在Apache2的一个实例中从两个虚拟主机提供。
我制作了一个虚拟主机,每个主机都有自己的目录settings.py和wsgi.py。
我一直看到的错误是:
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] mod_wsgi (pid=6375): Exception occurred processing WSGI script '/srv/app1/app1/wsgi.py'., referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] Traceback (most recent call last):, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] self.load_middleware(), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] for middleware_path in settings.MIDDLEWARE_CLASSES:, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] self._setup(), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] self._wrapped = Settings(settings_module), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] ImportError: Could not import settings 'app0.settings' (Is it on sys.path?): No module named app0.settings, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
app0.wsgi:
import os import sys sys.path.append('/srv/app0') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app0.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
app1.wsgi:
import sys sys.path.append('/srv/app1') import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app1.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
两个应用程序如何混淆?
从app1的页面的请求是抱怨,它无法加载从app0的设置 – 为什么它甚至尝试?
更新:
我特别担心,每个wsgi.py都将DJANGO_SETTINGS_MODULE设置为它自己的设置名称 – 这是问题的原因吗?
读:
不要使用os.environ.setdefault() ,使用os.environ[] 。
也使用mod_wsgi的守护进程模式,而不是embedded模式。
要在更新之后添加到此,环境variables的设置通常不是问题,因为您的两个应用程序将在该进程的不同子解释器上下文中运行。 在哪里跌倒是因为你正在使用os.environ.setdefault()因为如果环境variables已经设置,这将不会执行任何操作。 该环境variables实际上是过程广泛的,意味着哪个WSGI脚本文件首先将其设置为赢。 当你使用os.environ[]时,这个问题不会发生,因为它会覆盖子解释器上下文的环境variables,并忽略从进程级别inheritance的环境variables,因此请阅读博客文章并执行解释。