我正在尝试使用python中的请求模块上传带有PUT的文件。
我的代码是:
with open(file, 'rb') as payload:
r = requests.put(url, data=payload, auth=('username', 'password'))
文件已创建,我收到响应200,但它有0个字节。如果我没有做错事,我怀疑我遇到了错误here。
是这样的吗?如果是,我可以尝试任何解决方法吗?
我也尝试过使用httplib2库
with open(file, 'rb') as payload:
h = httplib2.Http(".cache")
h.add_credentials('user', 'pass')
resp, content = h.request(url, "PUT", body=payload)
但是请求永远保持挂起(再次创建一个0大小的文件)。请问模块也可能出现同样的问题吗?
[编辑]一些额外的信息。
接收PUT的服务正在ESXi虚拟机管理程序上运行。它有一个功能,如果你做一个authed PUT请求,它会将请求的文件存储在/ tmp中。服务器端正在工作(使用perl脚本测试它,它执行相同的工作,也使用curl)。
上传的文件是.tgz文件,该文件位于我的本地文件系统中,网址格式为"http://esx-server/tmp/file.tgz"
。
答案 0 :(得分:1)
所以似乎确实存在某种错误。
我的解决方案是使用urllib2。它不像请求那样“干净”。但仍然比我想象的要好。
我现在的工作代码是:
import urllib2
from base64 import b64encode
with open(source, 'rb') as file:
data = file.read()
request = urllib2.Request(url)
request.add_data(data)
request.add_header('Authorization', 'Basic ' + b64encode(username + ':' + password))
request.get_method = lambda: "PUT"
r = urllib2.urlopen(request)