Google AppEngine で外部ライブラリ

Google AppEngine APIは当たり前かもしれないが、データストアやキャッシュやメール等々、インフラ周りしかないため、その他の部分は適当なライブラリを選んで使うことになる。

では、GAEでは一般的にはどうしているかと言えば、http://code.google.com/intl/ja/appengine/docs/python/tools/libraries.htmlを見ると、Django*1が入っているので、TemplateEngineだのなんだのの作法が分らない奴はDjangoで解決せよという事なのだろう。

Djangoが古い

とはいえ、AppEngine標準のDjangoは0.9.6と若干古い*2。正式に1.xが出ているので、こちらを扱いたい。
appspot(production)の環境ではpython標準の.../lib/python2.X/site-packagesは見えないので、外部ライブラリを使うにはappengineプロジェクトディレクトリ内に直接入れておかなければならないが、特に小細工は必要なく、最新のDjangoを取って来て解凍してdjango/ディレクトリとしてプロジェクトルートに置いておけばよい。

のだが「 GAEのプロジェクトディレクトリには3000ファイルまでしかおけない」らしいので、ライブラリはzipで固めて置くのが通例のようだ。Djangoは特にFWという事でファイル数も多いので、無駄にリソースを消費する事になってしまうので、固めておいておきたい。

pip zip --no-pyc django

とコンソールを叩くとpyc抜き*3zipを作ったよとpath付きで教えてくれるのでpathの後ろに.zipをつけてcpすればok。

ただ、zipのimport機構はpython標準からカスタマイズされたGAE仕様らしいので、ものによってはうまくいかないものもあるらしい。(.eggファイルも無理っぽい)

GAEの動作をDjangoへ渡す

当方初学者のため、いきなりDjangoだのwsgi*4だの言われてもよくわからず、GAEからDjangoのつなぎ込みはとかどうすればいいんだ?としばし悩んだ。が解決策はあっさりと見つかった。
Google Code Archive - Long-term storage for Google Code Project Hosting.だ。

(入れてみると分るが、実はエントリポイントのmain.pyではそんなに複雑な事はやっていない。どうも、WSGI用の関数一つ呼んでいるだけみたいだ)

これ以降は特にGAEだから、という事もなくDjangoドキュメントを見ながらテンプレートエンジン等をいじればよいようだ。

注意点としては、GAEのDataStore APIDjangoのDatabase APIが元になっているそうだが、

Django データ モデリング インターフェースは、App Engine データストアとの互換性がありません

と但し書きがある点だ。メインとなるdbAPIに互換性がないので、以外と困る部分も多そうである。*5

今後もつづけてDjango路線で行くかどうか、もう少し軽量のライブラリを組み合わせるべきなのかは検討したい。

*1:python一流のフル装備なweb-framework

*2:Djangoの名が売れだした頃のバージョンだったか

*3:.pycは認識しない

*4:正式?にはウィスキーらしいが、上杉と読んでしまう

*5:勿論、Django目玉商品の一つcontrib.adminも使えないが、一応GAEにもhttp://localhost:8080/_ah/adminに管理機能があるのでそこまでがっかりしなくてもよさそうだ