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

时间:2015-01-20 21:25:31

标签: python django apache centos mod-wsgi

我正在将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(以及相关的),看似相似,但没有一个答案可以解决问题。我在<{1}}中运行 并且django似乎安装正确,因为我可以运行有问题的声明:

virtualenv

在交互式Python解释器中,它的工作就好了。以下是导致错误的脚本(它只是您在任何地方看到的默认>>> from django.core.wsgi import get_wsgi_application ):

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等)。再次,从交互式解释器运行完全相同的代码不会导致错误。

我尝试卸载/重新安装django(/usr/local/lib/python3.4/site-packages),然后将VM重置为完全干净的快照并重建/重新安装所有内容,我仍然得到完全相同的行为

发生了什么事?

1 个答案:

答案 0 :(得分:3)

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)))

Etvoilà,没有更多导入错误!


故事时间

在我绝望地开始攻击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中重新保存文件,我正默默地修复它们。