2011-11-08 38 views
3

根據apache的部署說明,我已經部署了我的django應用並且能夠完美地使用apache和mod_python。但是由於我在某種程度上改變了項目結構,所以我一直無法得到它的工作。不管我怎麼努力,我不斷收到以下頁面:如何排除故障 - 導入錯誤:部署django時無法導入設置'mysite.settings'?

MOD_PYTHON ERROR 

ProcessId:  27841 
Interpreter: '127.0.0.1' 

ServerName:  '127.0.0.1' 
DocumentRoot: '/var/www' 

URI:   '/myapp/' 
Location:  '/myapp/' 
Directory:  None 
Filename:  '/var/www/myapp' 
PathInfo:  '/' 

Phase:   'PythonHandler' 
Handler:  'django.core.handlers.modpython' 

Traceback (most recent call last): 

    File "/usr/lib/python2.6/dist-packages/mod_python/importer.py", line 1537, in HandlerDispatch 
    default=default_handler, arg=req, silent=hlist.silent) 

    File "/usr/lib/python2.6/dist-packages/mod_python/importer.py", line 1229, in _process_target 
    result = _execute_target(config, req, object, arg) 

    File "/usr/lib/python2.6/dist-packages/mod_python/importer.py", line 1128, in _execute_target 
    result = object(arg) 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/core/handlers/modpython.py", line 212, in handler 
    return ModPythonHandler()(req) 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/core/handlers/modpython.py", line 174, in __call__ 
    self.load_middleware() 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/core/handlers/base.py", line 39, in load_middleware 
    for middleware_path in settings.MIDDLEWARE_CLASSES: 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/utils/functional.py", line 276, in __getattr__ 
    self._setup() 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/conf/__init__.py", line 42, in _setup 
    self._wrapped = Settings(settings_module) 

    File "/usr/local/lib/python2.6/dist-packages/Django-1.3.1-py2.6.egg/django/conf/__init__.py", line 89, in __init__ 
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) 

ImportError: Could not import settings 'settings' (Is it on sys.path?): No module named settings 

閱讀不同的線程,這個問題可能是由以下

  • 不正確的Apache配置文件
  • 不正確的sys.path
  • 之一
  • 上的任何文件或目錄
  • 蟲子在我的Django的網站代碼不正確的權限

有什麼辦法可以縮小問題的範圍嗎?例如,有沒有辦法找出錯誤發生時的sys.path?有沒有可以幫助我的日誌文件?有沒有辦法區分「找不到文件」和「沒有讀文件的權限」?我希望更科學地解決這個解決方案,而不是僅僅嘗試隨機的東西,直到我偶然發現解決方案。

這個問題不是一樣的:Mod_python error: ImportError: Could not import settings。我特意要求幫助縮小可能的解決方案的方法,而不是解決方案本身。

+0

你是使用virtualenv還是隻使用全局python?你也可以發佈你的.wsgi conf文件嗎?這是設置模塊導入的地方,可能是問題出在 –

+0

發佈項目文件樹的表示。 –

+0

我確實在尋找一般的故障排除提示,而不是解決我的問題。給一個男人一條魚... – amarillion

回答

7

好吧,我自己解決了這個問題,所以我會回答我自己的問題。 我發現沒有apache日誌或任何其他信息來確定究竟是什麼導致導入錯誤。所以我在下面分享我的方法,作爲一種更爲「理性」的方法,希望我可以節省一些令人沮喪的小時隨機變化的東西。

爲了記錄,這裏是我使用的apache配置。

<Location "/mysite/"> 
    SetHandler python-program 
    PythonHandler django.core.handlers.modpython 
    SetEnv DJANGO_SETTINGS_MODULE mysite_django.settings 
    PythonOption django.root /mysite 
    PythonDebug On 
    PythonPath "['/home/mysite/prg/mysite/mysite_django', '/home/mysite/prg/mysite'] + sys.path" 
</Location> 

我在服務器上創建一個用戶「mysite的」,和Django的settings.py位於(有點冗餘命名)的位置/home/mysite/prg/mysite/mysite_django/settings.py。 我打開服務器的ssh頻道。在這種情況下,我使用了非常有用的工具screen用戶之間的快速切換(但第二個SSH通道將工作一樣好)

screen 

按Ctrl-A,Ctrl-C來創建一個新的屏幕。 現在看到正是因爲Apache沒有權限是非常重要的,所以我切換到運行Apache的用戶,這是在Debian系統WWW的數據:

sudo -i -u www-data 

我要去嘗試導入settings.py自己從Python環境:

python 

>>> import os, sys 
>>> print sys.path 
... result omitted ... 

顯然,這應該給你的標準sys.path中沒有任何的「mysite的」目錄的,因爲我們正在運行普通的Python。所以我修改sys.path如下。我複製粘貼直接從Apache配置,以避免錯別字:

>>> sys.path = ['/home/mysite/prg/mysite/mysite_django', '/home/mysite/prg/mysite'] + sys.path 
>>> import mysite_django.settings 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named mysite_django.settings 

正如預期的那樣,我得到了一個瀏覽器中加載我的網站時,我已經看到了同樣的錯誤。所以我可以在Python環境中複製這個問題,這是一件好事。顯然,構建路徑應該由sys路徑條目'/ home/mysite/prg/mysite'加上請求的導入路徑'mysite_django/settings.py'構成。那麼爲什麼它不是進口?讓我們確保給定的sys路徑條目實際存在

>>> os.path.exists (sys.path[0]) 
False 

它不存在嗎?奇怪。

>>> os.path.exists ('/home') 
True 
>>> os.path.exists ('/home/mysite') 
True 
>>> os.path.exists ('/home/mysite/prg/') 
True 
>>> os.path.exists ('/home/mysite/prg/mysite') 
True 
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django') 
False 

這裏我意識到mysite_django的權限有問題。可能是我所做的所有隨機變化的遺留問題。但實際上,問題出現在上面的目錄mysite中,因爲這是它嘗試從中讀取目錄列表的地方。我切換到超級用戶屏幕使用Ctrl-A,Ctrl-N組合,我用chmod設置的mysite的權限,使他們相同成功的最後一個目錄:

$ ls -la /home/mysite/prg 
total 12 
drwxr-xr-x 3 mysite mysite 4096 2011-11-08 11:24 . 
drwxr-xr-x 7 mysite mysite 4096 2011-11-08 14:56 .. 
drwxr-xr-- 6 mysite mysite 4096 2011-11-08 11:35 mysite 
$ chmod o+x /home/mysite/prg/mysite/ 
$ ls -la /home/mysite/prg 
total 12 
drwxr-xr-x 3 mysite mysite 4096 2011-11-08 11:24 . 
drwxr-xr-x 7 mysite mysite 4096 2011-11-08 14:56 .. 
drwxr-xr-x 6 mysite mysite 4096 2011-11-08 11:35 mysite 

切換回WWW -data屏幕使用Ctrl-A,按Ctrl-N:

>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django') 
True 
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django/settings.py') 
True 

現在到了最後的測試

>>> import mysite_django.settings 
>>> 

耶!成功 我們甚至可以更進一步,測試的Django可以加載

>>> from django.core.management import setup_environ 
>>> setup_environ(mysite_django.settings) 
'/home/mysite/prg/mysite/mysite_django' 

此時該網站是在瀏覽器中再次合作。

通過以下步驟,您至少可以確保:

  • 沒有了settings.py用戶WWW的數據
  • 有在Apache的PYTHONPATH設置不犯錯誤權限問題配置
  • 那裏爲我的Django 1.5和mod_wsgi的進口settings.py
+0

我的os.path.exists('/ home/mysite/prg/mysite/mysite_django/settings。py')是真的,但我仍然無法導入mysite_django.settings:沒有名爲mysite_django.settings的模塊幫助... – Robert

2

時沒有運行時錯誤,我決心像這樣:

的httpd.conf:

WSGIScriptAlias /mysite "/var/www/html/mysite/mysite/wsgi.py" 
WSGIPythonPath "/var/www/html/mysite/mysite" 
<Directory "/var/www/html/mysite/mysite"> 
    Order deny,allow 
    Allow from all 
</Directory> 

wsgi.py:
的sys.path.append(路徑)讓mysite.settings已知

import os 
import sys            #new 
path = '/var/www/html/mysite'       #new 
if path not in sys.path:        #new 
    sys.path.append(path)        #new 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

另一件事,爲了避免象下面誤差

Premature end of script headers: wsgi.py 

你需要刪除的httpd.conf

CGI配置
AddHandler cgi-script .py 
相關問題