2

我最近设置了一个 Web 服务器,它目前托管了几个静态页面网站和两个 django 项目。

这两个 django 项目是“abc”和“xyz”,分别位于主文件夹中的不同目录中。每个都有自己的 wsgi 脚本,指向各自的 settings.py 文件。

不过最近,我注意到“xyz”上有几个 500 个错误。通常刷新会纠正问题,但这是不可接受的,所以我检查了 apache error.log,并注意到有时当我点击“xyz”时,会出现一个异常,即在 xyz 项目中找不到 abc.settings。不知何故,这两个项目正在交叉并相互干扰。我在 abc 上的工作还不够多,还不知道问题是否与其他方式相同。下面是我的例外。

[Sun Jul 08 13:30:34 2012] [error] Traceback (most recent call last):
[Sun Jul 08 13:30:34 2012] [error] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__
[Sun Jul 08 13:30:34 2012] [error]    self.load_middleware()
[Sun Jul 08 13:30:34 2012] [error]    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware
[Sun Jul 08 13:30:34 2012] [error]      for middleware_path in settings.MIDDLEWARE_CLASSES:
[Sun Jul 08 13:30:34 2012] [error]    File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner
[Sun Jul 08 13:30:34 2012] [error]      self._setup()
[Sun Jul 08 13:30:34 2012] [error]    File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup
[Sun Jul 08 13:30:34 2012] [error]      self._wrapped = Settings(settings_module)
[Sun Jul 08 13:30:34 2012] [error]    File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__
[Sun Jul 08 13:30:34 2012] [error]      raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
[Sun Jul 08 13:30:34 2012] [error]  ImportError: Could not import settings 'abc.settings' (Is it on sys.path?): No module named scalamoosh.settings

任何帮助/建议将不胜感激。干杯

4

4 回答 4

5

您遇到的问题是,虽然 mod_wsgi 为每个 Django 应用程序提供了自己的 python 解释器,但它们仍然共享相同的操作系统环境,这是 Django 存储设置模块名称的地方。我发现的解决方法是在创建 WSGI 应用程序对象之前更改 Django 在其中查找设置模块的环境变量的名称。

我稍作修改的 wsgi.py 看起来像这样:

import os

# change the env variable where django looks for the settings module
import django.conf
django.conf.ENVIRONMENT_VARIABLE = "DJANGO_SECOND_SETTINGS_MODULE"

os.environ.setdefault("DJANGO_SECOND_SETTINGS_MODULE", "second.settings")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
于 2012-08-05T14:09:01.327 回答
3

mod_wsgi 的默认配置有两个 Django 站点在同一进程的不同子解释器中运行。不幸的是,Django 在 1.4 中更改了他们生成的 wsgi.py,并且新文件因 mod_wsgi 的这种默认行为而中断。要在使用 Django 1.4 时解决此问题,请进入 wsgi.py 文件并更改:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

至:

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

也就是说,不要使用 os.environ.setdefault() ,因为由于环境变量在子解释器之间泄漏的方式,当其他 Django 站点已经在另一个子解释器中设置了变量时,它不会做任何事情。

更好的是,使用 mod_wsgi 守护进程模式并为每个站点创建不同的守护进程组,并委托它们在不同的进程集中运行。这可以解决旧 Django 版本的类似问题,其中使用了不太正确的 VirtualHosts Apache 配置。

于 2012-08-06T00:15:11.577 回答
2

您目前似乎没有为您的两个项目使用单独的虚拟环境,如果没有,我强烈建议您这样做,然后看看问题是否仍然存在。您仍然可以使用相同的 Apache 实例,但运行两个单独的 Django 实例(以及项目的所有其他要求,可能会或可能不会不同)。这通常是任何 Django 项目的推荐方法。

如果你不了解虚拟环境,这里有一个关于使用 virtualenv 和 Django 的快速入门教程,我还建议使用 Doug Hellman 的非常好的Virtualenv Wrapper。希望这可以帮助!

于 2012-07-09T10:07:29.730 回答
0

您是使用memcached缓存,还是两个实例可以写入同一个缓存文件的任何其他缓存方法?这可以解释为什么这两种环境会混淆。在这种情况下,只需在您的设置字典中添加一个KEY_PREFIX变量。CACHES

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'KEY_PREFIX': 'scalamoosh'
    }
}
于 2012-07-18T13:07:37.217 回答