動作確認(ImportError: No module named django.core.handlers.modpython)

Apachemod_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)になるが、それは別の問題。