![](/img/trans.png)
[英]ImportError: No module named django.core.wsgi for wsgi server setting
[英]ImportError: No module named django.core.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'
我發現了這個問題 (以及相關問題), 這個問題似乎很相似,但沒有一個問題可以解決這個問題。 我沒有在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重置為一個完全干凈的快照並重建/重新安裝所有內容 ,但我仍然得到完全相同的行為。
到底是怎么回事?
由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'
的No module named 'django.core.handlers.wsgi'
即使沒有明確的相對導入。
這是它擊中我的時候。 我在gedit中打開了django/core/handlers/wsgi.py
,單擊了行的末尾,按下空格鍵,刪除了插入,並保存了文件。 它應該是一個無操作。 但是當我重新啟動服務器時,突然導入錯誤已轉移到另一個django導入。 唯一合乎邏輯的解釋是行結尾是錯誤的,通過在gedit中重新保存文件,我正默默地修復它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.