ImportError:没有名为 django.core.wsgi 的模块

Posted

技术标签:

【中文标题】ImportError:没有名为 django.core.wsgi 的模块【英文标题】:ImportError: No module named django.core.wsgi 【发布时间】:2015-03-19 06:37:45 【问题描述】:

我正在将一个 Web 应用程序从 Windows 环境迁移到 CentOS 5.11 和 Apache,并且安装了所有东西后,当我尝试加载该站点时,我收到了 500。错误日志显示如下:

mod_wsgi (pid=5461): Target WSGI script '/usr/local/treehouse/wsgi/index.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=5461): Exception occurred processing WSGI script '/usr/local/treehouse/wsgi/index.wsgi'.
Traceback (most recent call last):
  File "/usr/local/treehouse/wsgi/index.wsgi", line 11, in <module>
    from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django.core.wsgi'

我找到了this question(和相关的),看起来很相似,但那里的答案都没有解决问题。我没有virtualenv 中运行,django 似乎安装正确,因为我可以运行有问题的语句:

>>> from django.core.wsgi import get_wsgi_application

在交互式 Python 解释器中,它可以工作很好。这是导致错误的脚本(它只是默认的index.wsgi,您在寻找这些东西的任何地方都会看到):

import os, sys
sys.path.append('/usr/local/treehouse/apple')
sys.path.append('/usr/local/treehouse/apple/apple')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "apple.settings")

from django.core.wsgi import get_wsgi_application application = get_wsgi_application()

显然最后一行会导致错误,但有趣的部分是:最后一行仍然是问题,即使我在它上面添加了这个:

import django.core
import django.core.handlers

两个底层包都可以顺利导入(django.core.wsgi 只是django.core.handlers.wsgi 中某些功能的薄包装)。只有当我尝试访问 wsgi 包时才会出现问题。在此脚本中检查 sys.path 会显示所有正确的目录(/usr/local/lib/python3.4/site-packages 等)。同样,从交互式解释器运行完全相同的代码不会导致错误。

我尝试卸载/重新安装 django (pip install django==1.6.5),然后将 VM 重置为完全干净的快照并重建/重新安装所有内容,但我仍然得到完全相同的行为。

发生了什么事?

【问题讨论】:

【参考方案1】:

pip 拉下的一些 django 源文件以 Windows 行结尾 保存:也就是说,它们以 \r\n 而不是 \n 结尾。在 *nix 系统上,这会破坏受影响文件中的导入,因为它不是寻找 django.core.wsgi,而是尝试导入 django.core.wsgi\r

这就是为什么django.core.handlers 仍然可以被导入:__init__.py 文件是空的,所以没有行尾要损坏。

要修复它,请在受影响的文件上运行 dos2unix。我不确定实际上有多少文件受到影响(除了其中很多),所以我只是用解释器中的一个快速 Python 脚本来处理所有这些文件:

import os
from os.path import abspath, join

for root, _, files in os.walk('/usr/local/lib/python3.4/site-packages/django'):
    for f in files:
        os.system('dos2unix %s' % abspath(join(root, f)))

等等,没有更多的导入错误!


故事时间

在绝望地开始破解django 源文件后,我偶然发现了这个问题。我通过添加以下内容编辑了django/core/__init__.py(通常为空):

from . import wsgi

我修改了index.wsgi 以包含以下内容:

import django.core
django.core.wsgi  # no-op to see if we can access it

最后出现了一个有趣的新错误:

Traceback (most recent call last):
  File "/usr/local/treehouse/wsgi/index.wsgi", line 11, in <module>
    import django.core
  File "/usr/local/lib/python3.4/site-packages/django/core/__init__.py", line 1, in <module>
    from . import wsgi
  File "/usr/local/lib/python3.4/site-packages/django/core/wsgi.py", line 1, in <module>
    from django.core.handlers.wsgi import WSGIHandler
ImportError: No module named 'django.core.handlers.wsgi'

所以在django/core/__init__.py 中,我可以访问django/core/wsgi.py。但是django.core.handlers.wsgi 遥不可及。我删除了更改以重现原始错误 - 但错误已更改。现在我得到了No module named 'django.core.handlers.wsgi',即使没有明确的相对导入。

这就是它击中我的时候。我在 gedit 中打开django/core/handlers/wsgi.py,单击行尾,按空格键,删除插入,并保存文件。应该是无操作。但是当我重新启动服务器时,导入错误突然转移到另一个 django 导入。唯一合乎逻辑的解释是行尾错误,通过在 gedit 中重新保存文件,我默默地修复了它们。

【讨论】:

以上是关于ImportError:没有名为 django.core.wsgi 的模块的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:没有名为枚举的模块

ImportError:没有名为“appdirs”的模块

ImportError:没有名为 websocket 的模块

ImportError:没有名为“backports”的模块

ImportError:没有名为 ghostscript 的模块

ImportError:运行火花时没有名为请求的模块