【发布时间】:2011-11-02 15:51:47
【问题描述】:
所以我按照answers to another question 的建议调整了 urllib2:
class HttpRequest(urllib2.Request):
def __init__(self, *args, **kwargs):
self._method = kwargs.pop('method', 'GET')
urllib2.Request.__init__(self, *args, **kwargs)
def get_method(self):
return self._method
它适用于带有 JSON 的 PUT:
req = HttpRequest(url=url, method='PUT',
data=json.dumps(metadata))
response = urllib2.urlopen(req)
但它失败了data=二进制数据(下面的部分堆栈跟踪):
File "c:\appl\python\2.7.2\lib\urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "c:\appl\python\2.7.2\lib\urllib2.py", line 394, in open
response = self._open(req, data)
File "c:\appl\python\2.7.2\lib\urllib2.py", line 412, in _open
'_open', req)
File "c:\appl\python\2.7.2\lib\urllib2.py", line 372, in _call_chain
result = func(*args)
File "c:\appl\python\2.7.2\lib\urllib2.py", line 1199, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "c:\appl\python\2.7.2\lib\urllib2.py", line 1168, in do_open
h.request(req.get_method(), req.get_selector(), req.data, headers)
File "c:\appl\python\2.7.2\lib\httplib.py", line 955, in request
self._send_request(method, url, body, headers)
File "c:\appl\python\2.7.2\lib\httplib.py", line 989, in _send_request
self.endheaders(body)
File "c:\appl\python\2.7.2\lib\httplib.py", line 951, in endheaders
self._send_output(message_body)
File "c:\appl\python\2.7.2\lib\httplib.py", line 809, in _send_output
msg += message_body
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 10: ordinal
not in range(128)
有什么办法可以解决这个问题吗?
【问题讨论】:
-
metadata的类型是什么?如果是unicode,先编码成某种编码。 -
这是一个文件(pdf 或 jpg 之类的),可能有几兆字节,所以我正在寻找高效的文件。如果 urllib2 不是,那好吧。