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

2024-10-17 06:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个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重置为一个完全干净的快照,并重新构建/重新安装了所有的,仍然得到完全相同的行为。

怎么回事?


Tags: djangofromcoreimportwsgiapplegetindex
1条回答
网友
1楼 · 发布于 2024-10-17 06:19:36

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

Et voila,不再有导入错误!


故事时间

在我绝望地开始破解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,单击了一行的末尾,按下空格键,删除了插入,并保存了文件。这应该是一个no-op,但是当我重新启动服务器时,导入错误突然转移到另一个django导入。唯一合乎逻辑的解释是行尾是错误的,通过在gedit中重新保存文件,我正在默默地修复它们。

相关问题 更多 >