今更なんですか…
最近になって、『Flask』という Python のマイクロフレームワークの存在を知りました。フリスクじゃないよ。
ずっと Kay や Django みたいなフルスタックフレームワークを追っていたから、Flask に気付くのが遅れました。…って、これは言い訳ですね。
さっそく 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()