使用请求lib PUT二进制数据

时间:2012-02-15 07:47:41

标签: unicode python-2.7 put python-requests

我需要创建一个只在服务器上传文件的小型WebDAV客户端。

我发现“请求”库似乎很容易使用,但我无法正常使用它。

客户端应该传输二进制文件 - 所以我使用了以下示例:

>>> url = 'http://IPADDR/webdav'
>>> files = {'report.xls': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)

来自http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

对我来说这不起作用,我有以下错误:

File ".../site-packages/requests/packages/urllib3/connectionpool.py", line 260, in _make_request
  conn.request(method, url, **httplib_request_kw)
File ".../httplib.py", line 941, in request
  self._send_request(method, url, body, headers)
File ".../httplib.py", line 975, in _send_request
  self.endheaders(body)
File ".../httplib.py", line 937, in endheaders
  self._send_output(message_body)
File ".../httplib.py", line 795, in _send_output
  msg += message_body
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 147: ordinal not in range(128)

应该以某种方式编码输入文件? (我在“请求”文档中没有找到任何相关内容。)

1 个答案:

答案 0 :(得分:0)

经过一些调试后,我确实发现了正在发生的事情。

我能够通过在我的脚本中删除以下导入来修复此问题:

from __future__ import unicode_literals

此导入似乎导致urllib3中的unwanted string conversions(请求依赖)。 作为请求的作者explained,此问题应针对urllib3提交。