Python のマイクロフレームワーク『Flask』を試してみた

今更なんですか…

最近になって、『Flask』という Python のマイクロフレームワークの存在を知りました。フリスクじゃないよ。

ずっと Kay や Django みたいなフルスタックフレームワークを追っていたから、Flask に気付くのが遅れました。…って、これは言い訳ですね。

Flask の一番の特徴

何といっても、URL マッピングをデコレータで指定できるところがステキです。RubySinatra みたいに手軽に使えます。

さっそく App Engine で Flask 試してみます

まず環境構築

Python 用の App Engine SDK をインストールしておくのは必須。あとは、下記 URL から Flask の GAE プロジェクトテンプレートを入手すると手っ取り早いです。

一番単純なサンプル

これがフツーに Google App Engine で動きます。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

if __name__ == '__main__':
    app.run()

メソッドがハンドルする URL を、デコレータで指定できるところがクールです。

URL パラメータをメソッドの引数にマッピング
@app.route('/test/param/<name>')
def test_param(name):
    return 'Hello %s' % name

werkzeug みたいに書けます。中で werkzeug を使っているから、当然といえば当然なんですけどね。

リクエストを取り出す
@app.route('/test/request')
def test_request():
    return request.path
特定の HTTP メソッドだけをハンドルしてみる
@app.route('/test/post', methods=['POST'])
def test_post():
    return request.method

デコレータの引数 methods に、ハンドルしたい HTTP メソッドの配列を渡すだけ。「この URL は POST だけ OK」とかできます。

テンプレートを使って出力してみる
@app.route('/test/template')
def test_template():
    return render_template('test.html',
            name='foo',
            message='test');

テンプレートファイルは templates フォルダ内に配置しておく必要があります。

リダイレクトしてみる
@app.route('/test/redirect')
def test_redirect():
    return redirect(url_for('index'))

url_for に指定するのは、route デコレータをつけたメソッドの名前です。メソッド名が Kay でいうところのエンドポイント名になっています。

全体のソースコードはこちら
# -*- coding: utf-8 -*-

from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from flask import url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

# パラメータを引数にマッピングする
@app.route('/test/param/<name>')
def test_param(name):
    return 'Hello %s' % name

# リクエストを取り出す
@app.route('/test/request')
def test_request():
    return request.path

# 特定の HTTP メソッドだけハンドルする
@app.route('/test/post', methods=['POST'])
def test_post():
    return request.method

# テンプレートで出力する
@app.route('/test/template')
def test_template():
    return render_template('test.html',
            name='foo',
            message='test');

# リダイレクトする
@app.route('/test/redirect')
def test_redirect():
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run()

Flask いいよ Flask

Flask はテンプレートエンジンに Jinja2、ルーティングとかに werkzeug を使っています。werkzeug の超便利なデバッグ機能はもちろん使えます。結構大きなライブラリに依存しているので、マイクロフレームワークと呼ぶ事に対し、個人的にちょっと違和感があるかも。

画面数の少ない小規模なサービスを作るなら、Django や Kay を使うより圧倒的に手軽です。もちろん webapp よりも、ね。シンプルなサービスをシンプルに実装できるので気に入りました。