読者です 読者をやめる 読者になる 読者になる

Flask で Restful API を作る - jsonify で日本語が文字化けする時の解決方法

python Flask RestfulAPI appengine

Flask で RestAPI を作る - jsonify で日本語が文字化けする時の解決方法

最近ちょいちょい見かけることが増えてきた Python のフレームワーク Flask 。
軽量でシンプルなところが魅力となっていると思うのだが、業務で Flask を使って Restful API を開発する機会があり、jsonify を使って出力を JSON にしたところ、日本語の文字化け問題に遭遇したので、解決方法をメモしておく。

Flask を用いて JSON 出力する API を作る

Flask を用いて JSON で結果を出力する API のコードはこんな感じ。リスト tasks がデータベースの代わりということで。
gist.github.com
jsonify というメソッドがミソで、これが出力結果を JSON に変換するとともに、Content-Type もちゃんと application/json に設定して Response を返してくれる。

datalove.hatenadiary.jp

と思ってたら ...

jsonify の結果が文字化け

対象のデータ(今回の場合 tasks)に日本語が含まれていると、ブラウザで見た時に josnify の出力が文字化けしている ...
お約束の Python あるあるに遭遇。
gist.github.com

ルートパス / でアクセスした際の、普通の html 出力はちゃんと日本語が文字化けしないのに・・・
さて、どうしたもんだか。
jsonify って最後は結局 json.dumps なんじゃないの?だったら、ensure_ascii=False を指定できたら文字化け回避できるんだけどな・・・と思って Flask のソースを読んでみたら・・・アタリでした。

jsonify で日本語が文字化けする際の解決方法

Flask の jsonify は最終的に flask.json の json.dumps を実行していますが(ソースはここ)、その json.dumps の引数は _dump_arg_defaults メソッドで設定されています。
該当部分のコードだけ取り出すとこんな感じ。
gist.github.com

上のコードを見ればわかりますが、Flask のアプリケーションの config に、デフォルト設定項目として JSON_AS_ASCII なるものが定義されており、app.config['JSON_AS_ASCII']=False という具体にこれを設定すると最終的に json.dumps に ensure_ascii が設定されるようになっています。

jsonify の日本語文字化けを解決するコード

というわけで、最終的なコードは以下のようになりました。

gist.github.com

結果もホラ!文字化け解消しましたね!

gist.github.com

めでたしめでたし。

追伸:
Flask の公式ドキュメントにも書いてました。