Blank?=False

ゆるゆる仕事したいフリーランスエンジニアの記事

【Django】日本語を含むJsonを返す方法2つ

DjangoRest APIJsonを返そうと思ったら思いの外ハマったポイントがあるのでまとめます。

何にハマった?

DjangoAPIで商品モデル(Product)のデータを取得し、フロントのJavascriptで描画する、というものを作成していました。 そこで、jsonデータ自体は返せるもの、商品モデルのnameに日本語を使った文字列が入っているので、文字化けが発生。

Jsonの文字化けを防ぐため、色々と調べるとjson.dumpsJSON文字列を作るときにensure_asciiパラメータをFalseに設定すると良い、という情報が たくさん見つかりました。

qiita.com

これを参考に、以下のようなコードを組みましたが、今度はフロントエンド側でjson文字列がJSON.parce()で正常に配列化されない。 gist.github.com

ここでハマりました。

原因

一度Json.dumpsJson文字列を作っているのに、JsonResponseJson文字を再度Json化しようとしていたせいでした。

JsonResponseの実装を見ると

gist.github.com

data=json.dumps(...)json化しています。 ということは、JsonResponseを使うときはJson.dumpsしていない生のlistやdictを渡す必要があります。

公式DocにもdataはDictインスタンスを渡してね、って書いてありました。(・_・;) 悩んだら公式Docを読もう… docs.djangoproject.com

で、文字化けはどうするの?

JsonResponseを使う場合、JsonResposneの引数json_dumps_paramsにdump時のパラメータを渡せるので、 {"ensure_ascii"=False}をパラメータと渡せば意図した結果になります。

JSONデータを返す2つの実装方法

というわけで、JSONデータを返すための実装方法はjson.dumpsを使ってHttpResponseで返すか、JsonResponseを使うか、になります。

JsonResponse版

こっちがスマート。 gist.github.com

HttpResponse版

Content-Typeをつけ忘れそうな気もする gist.github.com

近況

最近、Djangoでとあるサービスを開発したのですがより使いやすく・自然な操作感のUXデザインを実現するべく、 フロントエンドフレームワークVue.jsを勉強しています。

フロントエンドフレームワークは初めて触るのでかなり手こずっていますが、勉強が一段落したら感想とか書いていきたいですね。