TeraBytesMemo

プログラミング関連で自分のメモをまとめて書いたり気が向いたら書いたり

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のアウトプットを設定できるミドルウェアが組めるみたい。

詳しくは参考記事で。

参考記事

Extending Flask-RESTful — Flask-RESTful 0.2.1 documentation

qiita.com