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重置为一个完全干净的快照并重建/重新安装所有内容,但我仍然得到完全相同的行为.
到底是怎么回事?
下拉的一些 django 源文件以Windows 行结尾pip保存:也就是说,它们以而不是结尾。在 *nix 系统上,这会破坏受影响文件中的导入,因为它不会查找 ,而是尝试导入.\\r\\n\\ndjango.core.wsgidjango.core.wsgi\\r
这就是为什么django.core.handlers仍然可以导入:__init__.py文件是空的,因此没有行结尾会损坏。
要修复它,请运行dos2unix在受影响的文件上运行。我不确定有多少文件实际受到影响(除了其中很多),所以我只是使用解释器中的快速 Python 脚本来处理所有这些文件:
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)))\nRun Code Online (Sandbox Code Playgroud)\n\n等 voil\xc3\xa0,不再有导入错误!
\n\n在我绝望地开始破解django源文件后,我偶然发现了这个问题。我django/core/__init__.py通过添加以下内容进行编辑(通常为空):
from . import wsgi\nRun Code Online (Sandbox Code Playgroud)\n\n我修改index.wsgi为包括以下内容:
import django.core\ndjango.core.wsgi # no-op to see if we can access it\nRun Code Online (Sandbox Code Playgroud)\n\n并最终出现了一个令人着迷的新错误:
\n\nTraceback (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\'\nRun 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\'现在我在没有明确的相对重要性的情况下得到了平衡。
就在这时,我受到了打击。我在 gedit 中打开django/core/handlers/wsgi.py,单击行尾,按空格键,删除插入内容,然后保存文件。它应该是一个无操作。但是当我重新启动服务器时,导入错误突然转移到了另一个 django 导入。唯一合乎逻辑的解释是行结尾是错误的,通过在 gedit 中重新保存文件,我正在默默地修复它们。
| 归档时间: |
|
| 查看次数: |
12547 次 |
| 最近记录: |