Flask で始める Google AppEngine アプリ開発


2010年 12月 15日

@t2y から Python Web フレームワークアドベントカレンダー の担当がパスされてきました。

僕は Python を使い始めて 1年ぐらいになるのですが、主にコマンドラインのアプリを作っていて
Web アプリには手をつけていなかったので、アドベントカレンダーに合わせて触ってみることにしました。

Web アプリの題材には、以前 Rails + Google Maps API で作った地図投稿アプリを使うことにしました。
以前 Rails 1.1 の練習題材として作ったのですが、バージョンアップの影響で
いつの間にか動かなくなってしまった残念なアプリです。

フレームワークには python のマイクロフレームワークの一つである Flask を、
実行環境には Google App Engine (以下、appengine)を使うことにしました。

環境の作り方

appengine の環境作りは非常に簡単です。アカウントを取って、buildout を走らせるだけです。
アカウントを取るところは割愛します。google で調べるといくつも記事が出てくると思います。

buildout は環境構築を行う際に用いるプログラムで、
設定ファイル(buildout.cfg)に書かれた手順に基づいて自動的に環境をセットアップしてくれます。
ここに私が作った設定があるので、ここではそれを利用します。
buildout の実行は以下のように行います。

% mkdir gmappers
% cd gmappers
% wget 'http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py'
% wget http://labs.timedia.co.jp/2010/12/15/buildout.cfg
% python bootstrap.py
% bin/buildout

たったこれだけで flask + appengine の開発環境ができあがりです。
buildout の内部では buildout.cfg で定義された

  • appengine sdk のインストール
  • 各種ライブラリ(Flask など)のインストール
  • その他開発ツールのインストール
  • アプリ雛型の生成

を実行しています。

はじめの一歩

さて、早速プログラムを動かしてみましょう。
何もプログラムを書いていない状態ですが、先ほどの buildout.cfg は
Flask アプリの雛型を生成しているためいきなり実行することができます。

dev_appserver コマンドで appengine を開発するためのテストサーバが起動します。

% bin/dev_appserver -p 8080 app/

そして、ブラウザで localhost:8080 を開いてみて下さい。
hello world の表示が確認できると思います。

では、実際のプログラム(app/main.py)を確認してみましょう。

@app.route('/')
def index():
    return 'hello world'

先ほどの表示に関わるコードはたったこれだけです。
@app.route() というデコレータで URL を定義して、後に続く関数でページの内容を指定します。
ここで return している部分を変更したり、HTML に変えたりして試してみて下さい。

さて、アプリケーションができあがったところで実際の appengine 環境にアップロードしてみましょう。
appcfg というコマンドで簡単にアップロード出来ます。

% vi app/app.yaml   # application: という行にアプリケーション ID を設定して下さい(初回のみ)
% bin/appcfg update app/

途中で ID, パスワードを入力すると開発したアプリケーションが appengine 環境にリリースされます。
実際に http://hogehoge.appspot.com/ にアクセスすると、同じ結果が得られると思います。

Flask + appengine の良いところ

Flask + appengine を触ってみた感想です。(まだ 2?3日しか触っていませんが…)

  • 良いところ
    • 構造がシンプルで使いやすい
      マイクロフレームワークの名前通り、シンプルで使いやすい構造をしています。
      ぱっと書き始めて、ぱっと結果を得ることができます。
    • 先人の知恵 buildout
      先人が提供してくれる buildout の設定、レシピはゴールまでの距離を短くしてくれます。
      これも素早く始めたいときに非常に便利です。
      ※ rails の場合はアプリケーションサーバが決めづらかったり、バージョン更新が激しかったり環境を作る部分でかなり苦労しました。
    • 継承テンプレート
      Flask が提供しているテンプレート機能(Jinja2)は継承テンプレートという機能を持っています。
      これによってレイアウト内の要素を部分的に置き換えたり、差し込んだりすることができます。
    • スケーラビリティ
      Appengine の魅力はアクセスが増加してきたときに自動的にスケールアウトしてくれることです。
      一気にアプリが人気になっても十分な負荷耐性が提供されるはずです。
      (自分が使ってる範囲では、その恩恵を受けたことはまだないですが…)
  • 悪いところ
    • DataStore
      まだ DataStore の考え方になれていないためか、混乱することが多々あります。
      Rails の ActiveRecord はかなり洗練されていたので、考え方を切り替えるのに苦労しています。
    • プログラム部品が少ない
      Flask 向けの情報(コード片)やプラグインなどが少ないような気がします。
      そのため、ちょっとした処理でも書き起こす必要がある印象があります。
      Rails では豊富にプラグインがあるのと比べると対照的な気がします。
    • 資料がちょっと少なめ
      ブログ記事や Tips などがあまり見あたりません。
      困ったら、とりあえずドキュメントを一通り読みましょう。
      ありがたいことに Flask
      Jinja2 もドキュメントが和訳されています。

まとめ

Flask + appengine はぱぱっとアプリケーションを作るには非常に手頃なフレームワークだと思います。
環境構築も最小限の手間でできるので準備?開発までに時間を必要としません。

実際、今回のアプリのデータ表示部分を移植するには 2日程度しかかかりませんでした。
勉強に要する時間も含めて、かなり早くできたんじゃないでしょうか。

さて次のアドベントカレンダーですが、普段 sphinx などでお世話になっている
@shibukawa さんにお願いします。