Python: DjangoをApacheから呼び出せるようにする方法

2010年2月14日

関連記事

Djangoはそれ自体に簡易Webサーバを搭載しています。
しかしそれを使えるのはせいぜいプロトタイプ開発までで、実運用時はApacheなどの 本格的なサーバを使用することになります。Apacheからdjangoのハンドラ群を呼び出せるように するための設定を以下に説明していきます。
1
2
cd /my/dir/
django-admin startproject hoge_proj
まずはプロジェクトを作成しましょう。

作成したプロジェクトのパスは、/my/dir/hoge_proj です。

1
emacs /etc/apache2/http.conf
ApacheにDjangoのハンドラ群を呼び出せるよう、設定します。


ApacheにどのURI以下をDjangoに任せるかをLocationディレクティブで指定する必要があります。


ここでは、/var/www/py/ 以下をDjangoに任せるよう設定する例を示します。

1
2
3
4
5
6
7
8
9
<Location "/py/">
  SetHandler python-program
  PythonHandler django.core.handlers.modpython
  PythonOption django.root /my/dir/hoge_proj
  PythonPath "['/my/dir'] + sys.path"
  SetEnv DJANGO_SETTINGS_MODULE hoge_proj.settings
  # PythonAutoReload On
  PythonDebug On
</Location>

上記のように設定することで、/var/www/py以下にアクセスすると、Djangoが応答するようになります。 とりあえず、http://yourdomain/py/にアクセスしてみましょう。

Djangoのエラーメッセージが出力されるはずです。


なお、このエラーメッセージには詳細なバックトレース情報等が表示されています。これは、 上記設定で「PythonDebug On」と指定しているためです。セキュリティや性能向上のためにも本運用時には コメントアウトするようにしましょう。


また、上記でコメントアウトしている「PythonAutoReload On」についてですが、 hoge_projプロジェクト配下のファイルが変更されるたびにApacheがリロードしてくれるという便利なものです。 開発状況に応じて使うようにしましょう。
Djangoは、Apahce + mod_pythonの構成で動作しています。


そのため、上記設定のほとんどはmod_pythonの書式に従っていますので、詳細はmod_pythonの資料をご参照ください。 mod_python運用で重要なポイントは、Apache起動時にインタプリタやプロジェクト内のCGIプログラムが すべてApacheプロセスのメモリ上にロードされるということと、HTTPリクエストに対してスレッドが応答するように なるということです。従って、動作が高速になると同時に、スレッド実装についてよく理解している必要がありますので 注意してください。また、プロジェクト内のCGIを書き換えてもApacheを再起動しない限り(「PythonAutoReload On」の 場合を除く)、メモリ上のプログラムは起動時のままであるということにも注意を払っておきましょう。

1
emacs /my/dir/hoge_proj/settings.py
次はsettings.pyの設定です。

設定内容は、個々の開発状況に応じて変化しますのでここでは基本的な事項だけ説明します。 Django v1.02のデフォルトのsettings.pyから変更する点としては、以下の項目があります。

1
2
3
4
5
6
7
TIME_ZONE = "ASIA/TOKYO"
DEFAULT_CHARSET = "utf-8"
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
CACHE_BACKEND = 'file:///var/cache/django'
TEMPLATE_DIRS = (
"/my/dir/hoge_proj",
)

上記で必須なのは、TEMPLATE_DIRSの設定です。

Djangoはビューをテンプレートファイルというもので定義するのですが、 そのテンプレートファイル置き場を上記のように指定しないと、Djangoがテンプレートファイルを 指定されたとき探すことができません。なので、絶対に設定するようにしておきましょう。

TIME_ZONEは、タイムスタンプを処理する際に重要となってきます。デフォルトではUTCになっていますから 日本の時刻を扱いたい場合は上記のように設定しておきましょう。そうすることでJST扱いになります。

DEFAULT_CHARSETは、自分がどの文字エンコーディングを使用するかということです。 できるだけDjangoに教えておいた方がよいでしょう。

SESSION_EXPIRE_AT_BROWSER_CLOSEは、Djangoのセッション機能を用いるときにつかう設定です。 Djangoでは、ハンドラリクエストオブジェクトを介して簡単にセッションを扱う仕組みがあるのですが、 そのセッションの有効期限を柔軟に設定すること出来ます。上記では、ブラウザを閉じたらセッションを 削除するという設定をしています。これは、セッションライブラリを使用しない限り関係のない話なので、 省略可能です。

CACHE_BACKENDは、Djangoでキャッシュ機能を使用するときに必要となる設定です。
Djangoは協力で柔軟なキャッシュ機能を持っています。ページ単位のキャッシュやオブジェクト単位のキャッシュ などです。また、キャッシュの実現方法も、メモリ、ファイル、データベースなど状況に応じて 変更できます。上記では、/var/cache/djangoというディレクトリに、キャッシュデータをファイルとして格納 するという宣言をしています。
/var/cache/djangoディレクトリは、自分で作成する必要があり、また権限も777にするなどしてWebサーバに ファイル作成権限を与えておく必要がありますので、自分で作成するようにしてください。


上記設定が完了すると、ApacheからDjangoを呼び出してくれるようになります。 あとは、/var/www/py/配下のURIに応答するハンドラの実装(コントロールの実装)、URLマッパの作成、 テンプレートファイルの作成(ビューの実装)や、DBを使用するようになるとモデルの実装が必要となってきます。

それについては、また後日!