Flask使ってみる

はじめに

機械学習とかで遊ぶためにPython触っとくかと思うけど、とりあえずWebエンジニアなのでWebから触ってみる。普段の仕事はRailsとExpressだけどRailsみたいなフルスタックで重厚なWebアプリケーションフレームワークよりもExpressのような軽量なやつの方が好みに合うので、まずはFlaskを触ってみる。

Flaskインストールまで

ドキュメント見ながらインストールまで流す。fish使ってるのでactivate.fishを読み込んでるけど自分の環境に合ったやつを読み込む。

$ mkdir flask-prj
$ cd flask-prj
$ virtualenv venv
$ . venv/bin/activate.fish
$ pip install Flask

hello world

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

ルーティングはデコレータで指定する。

実行

$ env FLASK_APP=hello.py flask run
 * Serving Flask app "hello"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

確認

$ curl http://localhost:5000/
Hello, World!

テンプレート

Jinja2というテンプレートエンジンが使える。文法はTwigとよく似たもの、っていうかTwigがJinjaを参考にして作ってるみたいなのでなんとなく使えそう。

@app.route('/template')
def template():
    return render_template('template.html', key1='val1', key2='val2')
<html>
    <body>
        <p>{{key1}}</p>
        <p>{{key2}}</p>
    </body>
</html>

確認

$ curl http://localhost:5000/template
<html>
    <body>
        <p>val1</p>
        <p>val2</p>
    </body>
</html>

JSON

最近の自分の仕事だと実際のところhtml返すよりjson返すほうが多いのでjsonの扱い方を見ておく。jsonはjsonifyを使って出力できる。

@app.route('/json')
def json():
    return jsonify(key1='val1', key2='val2')

確認

curl http://localhost:5000/json
{
  "key1": "val1",
  "key2": "val2"
}

マルチバイト文字

何も設定せずにjsonifyで出力すると、マルチバイト文字が文字コードで表示されてしまう。

@app.route('/json-multibytes')
def jsonmb():
    return jsonify(key1='日本語')

確認1

$ curl http://localhost:5000/json-multibytes
{
  "key1": "\u65e5\u672c\u8a9e"
}

対策

以下の設定を追加する。

app.config['JSON_AS_ASCII'] = False

確認2

$ curl http://localhost:5000/json-multibytes
{
  "key1": "日本語"
}