「リニアにスケールするように作れる」からこそのGoogle App Engine
Twitterを使ったブクマを格段に簡単にするTiny Quote

Google App Engine入門:フレームワークの選択

 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に公開しておいたので試したい方はどうぞ(https://github.com/snakajima/gdispatch)。

Comments

uemura

google app engineのフレームワークはkayも良いと思います。

コード
https://code.google.com/p/kay-framework/

ドキュメント
https://kay-docs-jp.shehas.net/

Pythonの代表的なWebアプリ用のモジュールである
werkzeugやjinja2などが上手く組み合わさっていると思います。

やっぱり厚めのフレームワークも試したい時にどうぞ

root

GAEOとか良さげですよ。

https://sites.google.com/site/docjpgaeo/

junya

ディスパッチャだけであれば urlrelay も使えそうです。
https://pypi.python.org/pypi/urlrelay/0.6

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)