2011年5月15日日曜日

web2py フレームワークについて

ひさびさの投稿です。
今回、web2py フレームワークについて書いていきたいと思います。

web2py フレームワークを調べようと思った動機

今まで、Django、Kay、WebApp とフレームワークを幾つも触ってきた。なぜここで web2py フレームワークなのか、今までのフレームワークには不満なのかと、思われるかもしれない。

最初に書いておくが、Django、Kay、WebApp といったフレームワークを使って開発を行うのは可能だし問題はない。 ただフレームワークが対応していない機能を利用する場合に少し厄介なことになる。

例えば外部認証を利用したい場合 Djangoなら、 django-openId や django-social-auth など便利なライブラリーが公開されている。しかしライブラリによっては RDBにしか対応していない、つまり Google AppEngine(GAE) の Datastoreでは動作しないため、コードに手を加えたり、違うライブラリーを利用するなどの工夫が必要だ。もちろん動けば問題ないのだが、ライブラリーを調べたり、適合させたり、実装後のバージョンアップをチェックしたりと、あまりスマートではない。また Django の機能は GAE 上で完全に動かないので注意が必要だ。

Kay は GAE に特化していて機能も豊富だ。しかしメジャーなフレームワークでないため、外部のライブラリーはほとんどない。フレームワークに存在しない機能を利用する時に、困ることになる。

WebApp は Googleが標準で提供しており、テンプレート言語など Djangoの機能も利用出来る。しかしフレームワークの機能は最小限に限られるので、何だかんだと幾つもの外部ライブラリーを導入することになる。これらのライブラリーの調査と導入、維持作業は結構大変だ。いろいろなライブラリーを組み合わせるので、セキュリティが維持されているのか不安な面もある。

どのフレームワークも一長一短で、開発に利用するにはしっくり来ない部分がある。もっとスマートな方法はないかと調べてみた。そうしたら、web2py というフレームワークがあり、いろいろな機能が含まれている。さらに GAE にも標準で対応しているという情報を得た。それならさらに調査しようとなった、わけである。

web2py フレームワーク概要(簡単な解説)

web2py は2007年に登場した比較的新しいフレームワークだ。作者は Massimo Di Pierro だ。ちょっと変わった名前の方だが、イタリアで生まれ育ったそうだ。Massimo は DePaul University で Django を使用して Webフレームワークを教えていたが、学生の学習曲線が低いのに気づき開発を始めたようだ。開発では Django や Rails などからのインスピレーションを受けたそうだ。

それでは設計思想について触れてみる。次のように web2py の目的は3つある。

簡単に使えること
web2py には開発に必要な全てが含まれている(フルスタック・フレームワーク)。データベース・Webサーバ・WebベースIDE・APIライブラリーなどである。このほか足りない機能は Plug-in として追加可能だ。
必要な機能はすべてフレームワークが提供する。これによって、開発をフレームワーク内で完結することができる。フレームワークを導入すれば、すぐ開発が可能だ。フレームワークから独立した機能はないので学習効率も高い。
例えば DAL(データベース抽象化レイヤ)があり、データベースを抽象化する。これにより MySQL、Oracle といったRDBだけでなく、GAEの Datastore に対しても DAL で抽象化し、同じスキルで開発ができる。
 
速く開発できること
web2py ではすべての機能はデフォルト値を持っている。どういうことかというと、例えば Django では 設定ファイル・urlディスパッチャ・テンプレート・ハンドラ関数 など全てに必要最低限の設定をしないとWebプログラムは動かない。しかし web2py は一部分だけでプログラムを動かすことが可能だ。定義していない設定はデフォルト値に従うようになる。
一例を挙げると、コントローラに機能(関数)を追加すれば、自動的にデフォルトのテンプレートとurlが割り当てられる。このような仕組みを活用することにより、速いスピードでの開発が可能になる。
 
セキュリティを常に保つこと
web2py はセキュリティ確保に力を注いでいる。クロスサイトスクリプティング や SQLインジェクション といったWebアプリケーションに対する脅威には、当然デフォルトで対応する仕組みになっている。さらに開発サーバはパスワードを設定しないと起動しない仕組み、アプリケーションでエラーが発生した時にエラーチケットを発行する仕組みなど、フレームワーク全体で総合的にセキュリティを保つ仕組みがある。
 

高機能だけど簡単に使えるようになっているフレームワークのようだ。次に個人的な感想を書いてみる。

web2py の個人的な感想

最初は WebベースIDE などの UI ばかりに目が行き、いろいろなパッケージを組み合わせた初心者向けのフレームワークなのかなと思っていた。しかし サンプル を眺めている内に考えが変わった。容易に開発が可能なのだが、高機能で強力なのがわかる。幾つかサンプルから抜き出してみる。

サンプル1
def hello1():
        return "Hello World"
このコードは単純だが、 web2py はこれだけで(コントローラのファイルに記述を追加する必要があるが)Webアプリケーションとして実行可能なようだ。
 
サンプル5
def hello5():
        return HTML(BODY(H1(T('Hello World'),_style="color: red;"))).xml() # .xml to serialize
このサンプルは最初何をしているのか分からなかったが、HTMLのBodyタグ以下を生成している。このように web2py はテンプレートに頼らなくてもコントローラ側である程度のHTMLコードが生成可能だ。
 
サンプル12
def makejson():
        return response.json(['foo', {'bar': ('baz', None, 1.0, 2)}])
この関数は、json を返す。
 
サンプル13
def makertf():
        import gluon.contrib.pyrtf as q
        doc=q.Document()
        section=q.Section()
        doc.Sections.append(section)
        section.append('Section Title')
        section.append('web2py is great. '*100)
        response.headers['Content-Type']='text/rtf'
        return q.dumps(doc)
RTFドキュメントを返すサンプル。
 
サンプル21
def test_def(): return dict()
{{extend 'layout.html'}}
{{def itemlink(name):}}
  • {{=A(name,_href=name)}}
  • {{return}}
      {{itemlink('http://www.google.com')}} {{itemlink('http://www.yahoo.com')}} {{itemlink('http://www.nyt.com')}}
    テンプレート内で python関数を定義しているサンプル。ちょっとこれは強力すぎる・・・と思ってしまった。
     
    サンプル28
    def form():
            form=FORM(TABLE(TR("Your name:",INPUT(_type="text",_name="name",requires=IS_NOT_EMPTY())),
                            TR("Your email:",INPUT(_type="text",_name="email",requires=IS_EMAIL())),
                            TR("Admin",INPUT(_type="checkbox",_name="admin")),
                            TR("Sure?",SELECT('yes','no',_name="sure",requires=IS_IN_SET(['yes','no']))),
                            TR("Profile",TEXTAREA(_name="profile",value="write something here")),
                            TR("",INPUT(_type="submit",_value="SUBMIT"))))
            if form.accepts(request,session):
                response.flash="form accepted"
            elif form.errors:
                response.flash="form is invalid"
            else:
                response.flash="please fill the form"
            return dict(form=form,vars=form.vars)
    
    フォームHTML を描画・入力値チェックを行う関数のサンプル。
     

    以上 web2py が強力そうだということは、わかっていただけたのではないだろうか。今後、web2py ネタも書いていきたい。


    web2py はまだ日本語資料が少ないようです。最後に今回の記事で参考にしたサイトを以下紹介します。

    参考
    web2py BOOK  → オフィシャルブック英語版です
    web2py BOOK 日本語版  → オフィシャルブック日本語版です
    web2py Examples  → オンライン上のサンプルです(同じ内容がフレームワークにも含まれています)
    web2py japan  → web2py BOOK の日本語訳があります
    Gilson #DEV  → 開発者インタビュー記事が載っています
    いすみのweb2py  → GAEアプリケーション開発に関する記事が載っているようです