requestsはpost、getに加えてdelete等も分かりやすく実装できるので便利。
ファイルだけを送信する方法やJSONだけを送信する方法はたくさんの記事があるが、ファイルとJSONを同時に送信する方法があまり見かけなかったので記載。
結論から言うと、ファイルを送信する場合、requestsのヘッダーに「multipart/form-data
」を設定する必要があるため、JSONをJSONとして送れない。
受信側でJSONとして扱えないため、注意が必要。
フォームデータとしてであれば、1リクエストでファイルとデータを送信できる。
やり方は以下の通り。
画像ファイルとデータのPOST
json.dumpsして送信していないので、受信側ではJSONとして扱えない。
以下のようにすれば、受信側JSON(というか辞書型)として扱える。
フォームデータをJSONっぽく受け取る
リストを取得する場合には少し工夫が必要。
form.data.getlist(‘data’)で取得した値はstr型なので、辞書型に変換する必要があるが、ダブルクォーテーションがシングルクォーテーションに変換されているため、json.dumpsが使えない。
そこで、ast.literal_evalを使用して文字列から辞書型に変換する。 ast.literal_eval はnodeかstringを引数に取る。
ファイルとJSONデータを別々に送信しても問題ないなら、その方がオーソドックスなやり方になるため、良いと思う。
以下のように送信すれば、 ast.literal_evalを使用しなくても値取得が可能となる。
画像ファイルとデータのPOST(リスト部分を文字列に変換してから送信)
json_data内のdata部分を事前にリストから文字列に変換して、POST送信する。
これで ast.literal_eval を使わずにdataを取得することが可能となる。
データ受信
data部分は、送信時に事前にjson.dumpsで文字列に変換しているため、request.form.getした際にJSON形式の文字列として取得可能。
そのままjson.loadsしてリスト、辞書型として扱える。