Python web フレームワーク Bottle の JSON レスポンスを人に読みやすくする
Python 用の web フレームワークに Bottle というものがある。
大変シンプルで 1 ファイルで実装されており pip 等でインストールしなくてもファイルコピーするだけで使えるおてがるさが魅力だ。
早速サンプルコード見ていく。
# sample.py
from bottle import Bottle, run
def create_app():
app = Bottle()
@app.get("/hello")
def api_hello():
return { "text": "こんにちは" }
return app
if __name__ == '__main__':
app = create_app()
run(app, host='localhost', port=8080, debug=True)
解説する必要もないシンプルな API を作っている。
早速実行して cURL でアクセスしてみる。
$ python sample.py
$ curl 'http://localhost:8080/hello'
{"text": "\u3053\u3093\u306b\u3061\u306f"}
Oops…
これは JSON.dumps(ensure_ascii=True) の挙動で ASCII 以外の文字はエンコードされている…
まあ、 JSON としては正しい形なんで問題はないけど、さすがに人間が読むのは難しいよね。
ということで、人間が読みやすい形にしたい。
Bottle では JSON にエンコードする処理は JSONPlugin が担っている。
こいつに ensure_ascii=False を明示的に指定すればいい。
import json
from bottle import Bottle, run, JSONPlugin
def create_app():
app = Bottle()
app.install(JSONPlugin(json_dumps=lambda s: json.dumps(s, ensure_ascii=False))) # これを追加
@app.get("/hello")
def api_hello():
return { "text": "こんにちは" }
return app
if __name__ == '__main__':
app = create_app()
run(app, host='localhost', port=8080, debug=True)
実行してみると
$ curl 'http://localhost:8080/hello'
{"text": "こんにちは"}
ちゃんとエンコードされずにレスポンス返ったね。