uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

flaskでjsonを返すサンプルコード

最近、Flaskというpython製のWAFを業務で使うために追加で調べている。

個人的には使ったことあるんだけど細かいところはどうなんだ?って突っ込んで調べなかったのでメモがてらにブログにポストします。

まず、単純にjson返すコードサンプル。

#!/usr/bin/env  python2.7
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/name/<name>.json')
def hello_world(name):
  greet = "Hello %s from flask!" % name
  result = {
    "Result":{
      "Greeting": greet
      }
  }
  return jsonify(ResultSet=result)

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

2行めでjsonifyをimportしておく。

あとは、普通にコード書く感じで13行目でkey-valueのような形式でレスポンスをセットしてやる。

上のpythonコードをindex.pyで保存して起動

% python2.7 index.py

そして別ターミナルからcurlでレスポンスをみる。

% curl -i http://localhost:5000/name/uokada.json
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 91
Server: Werkzeug/0.8.3 Python/2.7.1
Date: Fri, 09 Nov 2012 15:00:08 GMT

{
  "ResultSet": {
    "Result": {
      "Greeting": "Hello uokada from flask!"
    }
  }
}

このままだとLast-modifiedとかが設定出来てないのでもう少し工夫。 flask.after_this_request(f)

after_this_requestをimportしてさらにレスポンスを返す前に数行追加する。

#!/usr/bin/env  python2.7
from flask import Flask, jsonify, after_this_request
app = Flask(__name__)

@app.route('/name/<name>.json')
def hello_world(name):
  greet = "Hello %s from flask!" % name
  result = {
    "Result":{
      "Greeting": greet
      }
  }
  @after_this_request
  def d_header(response):
      """ add header

      Arguments:
      - `response`:
      """
      response.headers['Last-Modified'] = \
        "Wed, 21 Jun 2012 07:00:25 GMT"
      return response
  return jsonify(ResultSet=result)

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

でこの状態でまたcurlでアクセスしてやると今度はLast-Modifiedが追加されます。

# ヘッダーだけ。
% curl -I http://localhost:5000/name/uokada.json
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 91
Last-Modified: Wed, 21 Jun 2012 07:00:25 GMT
Server: Werkzeug/0.8.3 Python/2.7.1
Date: Fri, 09 Nov 2012 15:13:14 GMT

意外に簡単に対応出来ましたけどコードはちょっと気持ち悪いかなって印象です。

素直にjsonレスポンスを自作してヘッダーいじるようにしたほうがテストとか書きやすそうです。