見出し画像

Python_DRF_APIレスポンスをJSONファイルとして書き出す #343日目

Django Rest Framework を使ってAPI開発をしています。
その中でpytestを実装する時など、APIのレスポンス内容をJSONで出力したいケースがあったので、方法をメモしておきます。

DRFでは、APIサーバーをテストするためのAPIクライアントモジュールである「APIClient」が用意されています。

from rest_framework.test import APIClient

url = 'APIのURLを記載'
params = {query pathに入力したいパラメータがあれば記載}

# APIを叩いてjson
response = APIClient().post(url, data=params, format="json", **create_auth.user_header(user))
r_json = response.json()

実際にリクエストを投げてレスポンスを受け取るところを書いています。リクエストのURLとパラメーター、フォーマットを指定してAPIClient().post()でPOSTリクエストします。さらに返ってきたレスポンスを.json()でJSONに直しています。

次に、取得したJSONをファイルとして書き出してみます。

import sys
import json

output_path = 'jsonファイルを出力したいフォルダのパスを記載'

# 実行中のメソッドの名前を取得する
FILE_NAME = sys._getframe().f_code.co_name

# パスとファイル名、modeは書き出しなので「w」、文字化けしないようにencodingに「utf_8」をそれぞれ指定
with open(f'{output_path}/{FILE_NAME}.json', mode='w', encoding='utf_8') as f:
    data = r_json
    json.dump(data, f, ensure_ascii=False)

実行中の関数名を動的に取得してファイル名に使います。パスも定義して、with句を使って出力したいファイルに書き出します。JSONファイルを出力したいので拡張子は「.json」で、modeはw (write)、文字化け防止でencodingにutf_8を指定します。

sys._getframe().f_code.co_name
実行中の関数名・メソッド名を動的に取得できます。sys._getframe()以外にもinspectモジュールというもので取得する手段もあるらしいです。

json.dump()
dump関数は、データをJSONにエンコード(変換)しつつ、ファイルとして保存するための関数です。第一引数にjsonや辞書などのデータ、第二引数にファイルオブジェクトを指定します。ensure_asciiも引数の一つで、FalseにするとUnicodeエスケープされず、日本語の全角文字などがそのまま出力されます。他にもsort_keys, indent, separatorsなど整形用の引数があります。

ちなみにdump()と逆に、JSONからデコード(戻す)してデータ(辞書)として開けるのはload関数です。以下のように、第一引数にファイルオブジェクトを指定して使います。

with open(json_path) as f:
  json_data = json.load(f)

他にも紛らわしい関数としてdumps()とloads()があり、これらはファイルへの保存などは伴わずエンコードとデコードを行うだけの関数です。引数の使い方などはdumpとdumps、loadとloadsでそれぞれ同じです。

ここまでお読みいただきありがとうございました!


参考


いいなと思ったら応援しよう!