Google AppEngine で Django 1.1 を使う
Google AppEngine の SDK および実行環境には、Web アプリケーション・フレームワークの Django がプリインストールされている。
しかし、デフォルトで有効になっているのは 0.96 という相当古いバージョンだ(もっとも、Google AppEngine リリース時点では、これが最新のバージョンであった)。すでにサポートも終了しており、バグや脆弱性の修正もされないため、できれば最新の 1.0/1.1系列を使いたい、という人が大半だろう。
しかし、これまで、バージョン 1.0 以降の Django を Google AppEngine で使うのは骨の折れる作業だった。
- 使いたいバージョンの Django を丸ごとアップロードしなくてはいけなかった
- Django はファイル数が多いため、アップロード可能なファイル数制限を超えやすい
- デフォルトで有効になる古いバージョンの Django を無効化するために、呪文めいたコードが必要
だが、いまや状況は変わった。SDK 1.2.3 からは Django 1.0 が、SDK 1.2.5 からは Django 1.1 がサポートされ、Google AppEngine でも、簡単に Django 1.x を動かせるようになった。
google.appengine.dist.use_library
SDK 1.2.3/1.2.5 からは google.appengine.dist モジュールの use_library
関数を使うことで Django 1.0/1.1 を選択できるようになった。
使い方は簡単で、main.py
に以下のような記述を追加するだけだ。
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from google.appengine.dist import use_library
use_library('django', '1.1')
これまで開発者が各自行っていた sys.path
の調整は use_library
関数がやってくれる。
更に嬉しいことに、Django のコードをアップロードする必要もなくなった。Google AppEngine のサーバには Django 1.0/1.1 がインストールされている。ただし、SDK には Django 0.96 しか添付されていないので、1.0/1.1 を使う場合は、あらかじめローカルのマシンに Django 1.0/1.1 をインストールしておこう。
Django のバージョンと DoS 攻撃可能な脆弱性について
なお、実際に有効になる Django の詳細なバージョンは、本記事執筆時点の 2009 年 11 月で以下のようになっている(django.VERSION
で調べた)。
use_library | Django version |
---|---|
(None) | 0.96.4 |
use_library(1.0) | 1.0.2 |
use_library(1.1) | 1.1.0 |
残念ながら、1.0/1.1 は DoS 攻撃可能な脆弱性が修正されたバージョン ではないようだ(修正バージョンは 1.0.4/1.1.1)。
この脆弱性は EmailField
か URLField
に関連したものなので、それらを使っているプログラムでは Google AppEngine にインストールされた Django のアップデートを待つか、これまでどおりの方法で、修正済みのバージョンをアップロードした方が安全だろう。
Note
Google AppEngine プロジェクトに報告したところ、GAE で有効になるバージョンは修正済みのものである、とのこと。失礼しました。
main.py のサンプル
実際に use_library
を使ったサンプルを gist:245523 で公開している。