Flask で Restful API を作る - 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 を返してくれる。
と思ってたら ...
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 の日本語文字化けを解決するコード
というわけで、最終的なコードは以下のようになりました。
結果もホラ!文字化け解消しましたね!
めでたしめでたし。
追伸:
Flask の公式ドキュメントにも書いてました。