Google App Engine入門:フレームワークの選択
2009.11.17
Google App Engine向けのアプリを作る際に最初に悩んだのはフレームワークの選択。Google App Engineにはwebappという最低限の機能を持ったフレームワークが付いて来るが、Python使いの人たちの間では、DJangoというフレームワークが広く使われているらしいし。かといって、あまり大きなフレームワークを使うと、パフォーマンスのチューニングとかもしにくくなるし、フレームワークそのもののバグや制限に悩ませられる可能性もある。
そんな中で増井君が見つけてくれてまず試したのが、Junoというフレームワーク。DJangoと比べると遥かに小さく、WebappよりもURLのルーティングのメカニズムとかが充実している。
そこで一旦はアプリをJunoの上で作り始めたのだが、Junoのソースコードを見ているうちにいろいろと気に入らないところが出て来た。不必要にオプションが多いし、同じことをする方法を何通りも用意している点が気に入らない。そしてどうしても我慢ができなかったのが、レスポンスをグローバル変数を通して行っていること。ちょっとこれでは使えない。
そこで着目したのが、JunoにあってWebappに不足しているのはURLルーティングのローカルな記述だけだという点。Webappの場合、URLのルーティングの規則を以下のように一カ所に固めて書かねばならないのだが、
class LoginHandler(webapp.RequestHandler):
def post(self):
... loginの実装
class LogoutHandler(webapp.RequestHandler):
def get(self):
... logoutの実装
application = webapp.WSGIApplication([('/login', LoginHandler),
('/logout', LogoutHandler),
... URLからHandlerへのマッピングリスト
])
wsgiref.handlers.CGIHandler().run(application)
Junoの場合は以下のように、処理をするファンクションにデコレータの形でURLを記述できるのである。
@juno.post('/login')
def process_login_form(web):
... loginの実装
@juno.route('/logout')
def logout(web):
... logoutの実装
juno.run()
そこで思いついたのが、同じような仕組みをwebappでできるようにするモジュールを作るということ。それさえできれば余計なフレームワークなしでwebapp上でアプリを作ることができる。
そして試行錯誤の作ったのが、gdispatchというモジュール。使い方はほぼJunoと同じで、
@gdispatch.route(lambda:('/login', LoginHandler))
class LoginHandler(webapp.RequestHandler):
def post(self):
... loginの実装
@gdispatch.route(lambda:('/logout', LogoutHandler))
class LogoutHandler(webapp.RequestHandler):
def get(self):
... logoutの実装
gdispatch.run()
とするだけの話。これがあれば、RequestHandlerの数が増えて複数のファイルまたがったとしても、関連するURLマッピングのルールはそれぞれのRequestHandlerと一緒に記述できるのでとても便利である。
ということで、結論としては「フレームワークとしては、Google App Engineに標準で付いて来るwebappに必要最小限の手を加えて使うのが一番良い」というのが私なりの結論である。
ちなみに、gdispatchはgithubに公開しておいたので試したい方はどうぞ(http://github.com/snakajima/gdispatch)。
google app engineのフレームワークはkayも良いと思います。
コード
http://code.google.com/p/kay-framework/
ドキュメント
http://kay-docs-jp.shehas.net/
Pythonの代表的なWebアプリ用のモジュールである
werkzeugやjinja2などが上手く組み合わさっていると思います。
やっぱり厚めのフレームワークも試したい時にどうぞ
Posted by: uemura | 2009.11.18 at 01:28
GAEOとか良さげですよ。
http://sites.google.com/site/docjpgaeo/
Posted by: root | 2009.11.18 at 06:27
ディスパッチャだけであれば urlrelay も使えそうです。
http://pypi.python.org/pypi/urlrelay/0.6
Posted by: junya | 2009.12.06 at 00:12