djangoappengineを使うと既存のDjangoプロジェクトをAppEngineにほぼそのまま移植できるらしい
AppEngine SDKにはDjango1.2が含まれてるけど、DBがRDBじゃなくBigTableであるという制約からModelまわりで純粋なDjangoの様には操作できない。そのため、既存のDjangoプロジェクトをAppEngineに移植するのは、案外難しい。
一応Googleが用意してるヘルパーもあるけど、十分ではないみたい。
この問題をなんとかしよう!というのがdjangoappengine。複数のサブプロジェクトからなる。djangoappengineを使うと、既存のDjangoをほぼ変化なしでAppEngineに移植できるらしい。凄い!
django-debug-toolbarみたいな、Django用のアプリケーションも、そのまま利用することが可能(らしい)。
ちなみにdjangoappengineで動くのはDjango 1.3で、最新のDjangoを使いたい場合にも便利。
インストール
djangoappengine - Django App Engine backends (DB, email, etc.) | All Buttons Pressed
上記のページのInstallationにあるリンクから以下をダウンロード
- django-nonrel
- djangoappengine
- djangotoolbox
- django-autoload
- django-dbindexer
- django-testapp # これはおまけみたいなもの
それぞれを解凍して
- django-nonrel/django => <project>/django
- djangotoolbox/djangotoolbox => <project>/djangotoolbox
- django-autoload/autoload => <project>/autoload
- django-dbindexer/dbindexer => <project>/dbindexer
- djangoappengine => <project>/djangoappengine
のように配置する。<project>が既存のDjangoプロジェクトのディレクトリ。シンボリックリンクでもいい。
で、django-testappの中の".py"と".yaml"ファイルも全て<project>の中に入れる。settings.pyの設定とかは必要に応じてtestapp中のsettings.pyに移植する。app.yamlのプロジェクト名は自分のに変える。
この状態で、django-testappから持ってきたmanage.pyに対して
$ python2.5 manage.py createsuperuser $ python2.5 manage.py runserver
とかをやると、AppEngineのプロジェクトとして起動される。
$ python2.5 manage.py syncdb
とかやるとDBが作られるので、runserverした状態でhttp://localhost:8000/_ah/adminにアクセスするとauth_userとかauth_permissionとかdjango_content_typeみたいな、見覚えのあるテーブルが生成されているのが見れる。
注意事項
dev_appserver.pyで起動しない
理由はよくわからないけど、ダメらしい。起動するときはrunserverを使う。まぁDjangoに慣れてる人にとってはその方がありがたいような気もする。
多対多は中間テーブルを明示的に作る必要がある
どういうわけかImageFieldとManyToManyFieldが使えないんだとか。
というわけで、ForeignKeyを2つ持ってる中間テーブルを作って自分で実装しないといけないっぽい。
プロジェクトを一から始める
この場合は上でダウンロードしたtestappを上書きしていく形で実装すると楽。testappディレクトリを<project>と見立てて上で書いたようにautoloadディレクトリなどを配置する。
他のバージョンのDjangoがインストールされてる
virtualenvが使えればいいけど、以前試したときはvirtualenvとAppEngineは相性が悪くてうまく行かなかった。
しかしながら、今回の場合、プロジェクトの中に改造されたdjango自体が入っているので、これを使えば特に問題にはならない。
というわけで
djangoappengine使って何か作ってみたいと思います!