ひさびさの投稿です。
今回、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')}}
- サンプル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アプリケーション開発に関する記事が載っているようです |