動作確認(ImportError: No module named django.core.handlers.modpython)
Apacheとmod_pythonで動作環境を構築したつもりなのだが、アクセスするとエラーになる。mod_pythonの設定に問題があるのか?これは手強い。
現状確認から始めよう。データベースはまだインストールしていない。
Djangoアプリの場所
Apache2を起動して、http://(サイトのIP)/をブラウザで見ると、/opt/local/apache2/htdocs/index.htmlが表示されるのを確認している(ドキュメントルート)。
Djangoアプリが動くように設定したい。Djangoアプリの置き場所は、/Users/hoge/Django/myappとしている。myappはプロジェクト名。myappディレクトリの中にsettings.pyファイルがある。
httpd.confの設定
mod_pythonを使えるように、Apache2の設定ファイル(httpd.conf)の最後に以下の数行を追加する。
<Location "/mysite/"> SetHandler python-program PythonHandler django.core.handlers.modpython PythonOption django.root /mysite PythonPath "['/Users/hoge/Django'] + sys.path" SetEnv DJANGO_SETTINGS_MODULE myapp.settings PythonDebug On </Location> <Location "/media"> SetHandler None </Location> <LocationMatch "\.(jpg|gif|png)$"> SetHandler None </LocationMatch>
エラー発生
こうしておいて、apacheを再起動。
$ sudo apachectl restart
ブラウザで、アクセスすると、
http://(サイトのIP)/mysite の場合、404 Not Found、
http://(サイトのIP)/mysite/ の場合、MOD_PYTHON ERROR
となる(最後にスラッシュを付けるか付けないかの違い)。
MOD_PYTHON ERROR
...
ImportError: No module named django.core.handlers.modpython
考察と解決方法
なぜimportエラーになるのか?
$ python Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import django.core.handlers.modpython
インタラクティブシェルでは問題なくimportされるのに...。そもそもmodpython.pyファイルはどこにあるのか探してみる。
$ find / -name modpython.py /Library/Python/2.6/site-packages/django/contrib/auth/handlers/modpython.py /Library/Python/2.6/site-packages/django/core/handlers/modpython.py
見つかった。一方で、Apacheがリクエスト処理するときのsys.pathがどうなっているのかのチェックのために、httpd.confの中で、
... # PythonHandler django.core.handlers.modpython #一時的にコメントアウト PythonHandler mod_python.testhandler ...
とする。Apacheを再起動して、http://(サイトのIP)/mysite/にアクセスすると、画面には下の表示を含むGeneral informationが表示される。
こんなのが表示される。つまりだ、modpython.pyがあるべきディレクトリがsys.pathに含まれていない。これがいけない。そこで、httpd.confの中で、PythonPathの設定を修正する。
... PythonPath "[/Users/hoge/Django', '/Library/Python/2.6/site-packages/'] + sys.path" ...
これで、ImportError: No module named django.core.handlers.modpythonは解消された。
でも、今度は他のImportError(No module named myapp.forms)になるが、それは別の問題。