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使って何か作ってみたいと思います!