5

私は、これまでのところ大喜びだった Python Requests モジュールをいじっています。

ただし、multipart/form-data を使用して zip ファイルを投稿しようとしたときに問題が発生しました。

ダイジェスト認証を使用しており、.xls などの他のファイル タイプを正常に投稿できました。

以下を使用して投稿リクエストを作成しています。

file = open('/Users/.../test.zip', 'rb').read()
r = requests.post(url, auth=HTTPDigestAuth('dev', 'dev'), data = {"mysubmit":"Go"}, files={"archive": ("test.zip", file)})

これはエラーになり、次のようになります。

requests.exceptions.ConnectionError: HTTPConnectionPool(host='10.2.2.70', port=80): Max retries exceeded with url: /plugin_install 
(Caused by <class 'socket.error'>: [Errno 32] Broken pipe)

サイズの小さい zip ファイルを使用して、データ/ファイルの値を変更しようとしましたが、同じエラーが発生します。

明らかな何かが欠けていますか?

あなたが流すことができる光をありがとう!

4

2 に答える 2

15

requests関係する限り、zip ファイルとその他のデータのバイナリ BLOB との間に違いはありません

あなたのサーバーはここで壊れています。zipファイルで送ると接続が切断されます。それはどうにかrequestsできるものではありません。

このような問題が発生した場合は、テストすることをhttp://httpbin.org/お勧めします。requestsこれは、ライブラリの作成者によって構築されたテスト サービスです。

もう 1 つのヒント: 送信時にファイル オブジェクト全体をメモリに読み込む必要はありません。requests代わりにオブジェクト自体を渡すだけです:

fileobj = open('/Users/.../test.zip', 'rb')
r = requests.post(url, auth=HTTPDigestAuth('dev', 'dev'), data = {"mysubmit":"Go"}, files={"archive": ("test.zip", fileobj)})

に対するデモhttpbin.org:

>>> import requests
>>> fileobj = open('/tmp/test.zip', 'rb')
>>> r = requests.post('http://httpbin.org/post', data={"mysubmit":"Go"}, files={"archive": ("test.zip", fileobj)})
>>> r
<Response [200]>
>>> r.json()
{u'origin': u'217.32.203.188', u'files': {u'archive': u'data:application/zip;base64,<long base64 body omitted>'}, u'form': {u'mysubmit': u'Go'}, u'url': u'http://httpbin.org/post', u'args': {}, u'headers': {u'Content-Length': u'57008', u'Accept-Encoding': u'gzip, deflate, compress', u'Connection': u'close', u'Accept': u'*/*', u'User-Agent': u'python-requests/1.2.3 CPython/2.7.5 Darwin/12.4.0', u'Host': u'httpbin.org', u'Content-Type': u'multipart/form-data; boundary=9aec1d03a1794177a38b48416dd4c811'}, u'json': None, u'data': u''}
于 2013-08-13T11:44:03.277 に答える