Pythonのrequestsでmultipart/form-data形式通信を行う

著者:杉浦

Pythonのrequestsでmultipart/form-data形式通信を行う

 multipart/form-dataは文書、ファイル、またはバイト列の性質や形式を示す標準の一つです。multipart/form-dataは複数の部分から成るHTMLフォームのデータです。
MIME タイプ – HTTP | MDN #multipartform-data
 multipart/form-dataはごちゃまぜの種類のデータをまとめて送る時に便利です。これをどうやって使うかですがJavaScriptならば描画しないフォームを作り、それを送ることができます。次のコードはある画像ファイルとその画像ファイルの加工データを送信するのコードの一部です。JavaScriptはHTMLを扱う機能が数多く備わっており、フォーム形式の通信もJavaScript単独でパパっと書けます。

const formData = new FormData();// フォーム作成
formData.append('original_file', this.file);// フォームに値を入力
formData.append('cropped_file', croppieResponse);// フォームに値を入力

// multipart/form-data形式を指定して通信
axios.post(this.uploadDistUrl,
    formData,
    {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    }
).then((uploadImgResponse) => {
  // 通信成功時処理
}).catch(() => {
  this.vodalMsg = '通信に失敗しました。';
});

 pythonにはrequestsというHTTP通信用ライブラリがあります。これは人間に優しいを謳い文句にするくらい簡単に動かせることが特徴です。どのくらい楽かというと次の読みやすいインデント、改行の10行ないコードだけのファイルでpostを投げられるくらいです。

import requests

request_data = {
    'id': 'hoge',
    'password': 'fuga',
}

response = requests.post('http://127.0.0.1:8000/api/hoge', params=request_data)
print(response)

 便利なrequestsでmultipart/form-dataで送る方法を調べたところ次のコードで実現できました。
Quickstart — Requests 2.21.0 documentation#post-a-multipart-encoded-file

import requests

request_data = {
    'id': 'hoge',
    'password': 'fuga',
}
files = {'image': ('hoge_image',
                   'data:image/png;base64,000000000',
                   'image/png')}

response = requests.post('http://127.0.0.1:8000/api/hoge', params=request_data, files=files)
print(response)

 filesの様に色々形式毎の引数を用意して渡せば、まとめてよしなに送信してくれます。とてもとても便利ですね。

  • この記事いいね! (0)

著者について

杉浦 administrator