Flask-RESTfulにおける文字化け対策
flask-restfulで日本語を扱うときに、日本語が文字化けするのでその対処法。
例えば、以下のようなAPIを作成してアクセスした場合
#!/usr/bin/env python # coding: utf-8 from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'ワールド'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True) || >|python| @api.representation('application/json') def output_json(data, code, headers): resp = make_response(json.dumps(data, ensure_ascii=False), code) resp.headers.extend(headers) return resp
以下のように表示される。
{ "hello": "\u30ef\u30fc\u30eb\u30c9" }
そこで、文字化け対策する場合は、以下のようなコードの追加を行う。
#!/usr/bin/env python # coding: utf-8 from flask import Flask, make_response #モジュールの追加 from flask_restful import Resource, Api, reqparse #モジュールの追加 import json #モジュールの追加 app = Flask(__name__) api = Api(app) @api.representation('application/json') #追加 def output_json(data, code, headers): resp = make_response(json.dumps(data, ensure_ascii=False), code) resp.headers.extend(headers) return resp class HelloWorld(Resource): def get(self): return {'hello': 'ワールド'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True)
すると
{"hello": "ワールド"}
と無事正確に表示される。
どうやら、上記のoutput_jsonで、jsonのアウトプットを設定できるミドルウェアが組めるみたい。
詳しくは参考記事で。
参考記事