2011-11-08 2 views
3

私はApacheのデプロイメントの指示に従って、私のdjangoアプリケーションをデプロイし、apacheとmod_pythonで完全に動作しています。しかし、私はプロジェクトの構造を若干変更して以来、私はそれを働かせることができませんでした。トラブルシューティング方法 - ImportError: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の設定ファイルの1
  • 正しくないの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> 

Iは、サーバ上のユーザ「個人用サイト」を作成し、Djangoのsettings.pyは(多少重複命名)に位置している場所/home/mysite/prg/mysite/mysite_django/settings.py。 私はサーバーにsshチャネルを開きます。この場合、私は、新しい画面を作成するために、ユーザー(が、第2のsshチャンネルは全く同じように動作します)

screen 

押してCtrlキーを押しながらA、Ctrl-Cをすばやく切り替えるために非常に便利なscreenユーティリティを使用します。 は、今ではApacheはまったく同じよう権限を確認することが重要ですので、私はDebianシステム上のWWW-データであるApacheを実行するユーザーに切り替える:

sudo -i -u www-data 

私はsettings.pyをインポートしようとするつもりです自分のpython環境から:私たちは、プレーンのpythonを実行しているので、

python 

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

これは明らかに、「個人用サイト」ディレクトリのいずれかなしにあなたの標準のsys.pathを与える必要があります。そこで以下のように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 

これは存在しませんか?奇妙な。

ここで私はmysite_djangoの権限に間違いがあることを認識しています。おそらく私が作ったすべてのランダムな変更からの残されたものでしょう。しかし実際問題は上記のディレクトリmysiteにあります。なぜならそれはディレクトリのリストを読み込もうとするからです。私は、Ctrlキーを押しながらA、Ctrlキーを押しながらNとスーパーユーザーの画面に切り替えて、私は彼らが成功した最後のディレクトリと同じになるように、個人用サイトの権限を設定するchmodを使用します。

$ 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に戻っ切り替えCtrlキーを押しながらA、Ctrlキーを押しながらNと-data画面:最終テスト

>>> import mysite_django.settings 
>>> 

イェーイため今

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

!成功 我々はさらに行くとそのDjangoはサイトが私のブラウザで再び働いていた。この時点で

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

を読み込むことができますテストすることができます。

次の手順を実行することによって、あなたは、少なくともそれを確保することができます:

  • ユーザーWWW-データのsettings.pyにはパーミッションの問題
  • あなたのapacheのにPythonPathの設定に誤りがないがありません設定
  • 私のジャンゴ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(パス)以下のようなエラーを回避するために、

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

別の事を知らmysite.settingsを聞かせします

Premature end of script headers: wsgi.py 

あなたは、httpd.conf

からのCGIの設定を削除する必要があります
AddHandler cgi-script .py