最近、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レスポンスを自作してヘッダーいじるようにしたほうがテストとか書きやすそうです。