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

Hen*_*ter 6 python apache django mod-wsgi centos

我正在将一个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'
Run Code Online (Sandbox Code Playgroud)

我发现了这个问题(以及相关问题),这个问题似乎很相似,但没有一个问题可以解决这个问题.我没有运行virtualenv,并且django似乎安装正确,因为我可以运行有问题的声明:

>>> from django.core.wsgi import get_wsgi_application
Run Code Online (Sandbox Code Playgroud)

在交互式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()
Run Code Online (Sandbox Code Playgroud)

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

import django.core
import django.core.handlers
Run Code Online (Sandbox Code Playgroud)

这两个底层软件包都可以顺利导入(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重置为一个完全干净的快照并重建/重新安装所有内容,但我仍然得到完全相同的行为.

到底是怎么回事?

Hen*_*ter 3

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

\n\n

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

\n\n

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

\n\n
import os\nfrom os.path import abspath, join\n\nfor root, _, files in os.walk(\'/usr/local/lib/python3.4/site-packages/django\'):\n    for f in files:\n        os.system(\'dos2unix %s\' % abspath(join(root, f)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

等 voil\xc3\xa0,不再有导入错误!

\n\n
\n\n

讲故事的时间

\n\n

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

\n\n
from . import wsgi\n
Run Code Online (Sandbox Code Playgroud)\n\n

我修改index.wsgi为包括以下内容:

\n\n
import django.core\ndjango.core.wsgi  # no-op to see if we can access it\n
Run Code Online (Sandbox Code Playgroud)\n\n

并最终出现了一个令人着迷的新错误:

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

所以从内部django/core/__init__.py,我可以访问django/core/wsgi.py。却django.core.handlers.wsgi是遥不可及。我删除了更改以重现原始错误 - 但错误已更改。No module named \'django.core.handlers.wsgi\'现在我在没有明确的相对重要性的情况下得到了平衡。

\n\n

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

\n