在Python 2.7中找不到支持http PUT的库

时间:2011-03-16 13:17:52

标签: python http pycurl http-put

我需要从python执行http PUT操作已经证明哪些库支持这个?更具体地说,我需要在密钥对上执行PUT,而不是文件上传。

我一直在尝试使用restful_lib.py,但是我从我测试的API中获得了无效结果。 (我知道结果是无效的,因为我可以从命令行使用curl触发相同的请求并且它可以工作。)

在参加Pycon 2011之后,我得到的印象是pycurl可能是我的解决方案,所以我一直在尝试实现它。我这里有两个问题。首先,pycurl将“PUT”重命名为“UPLOAD”,这似乎意味着它专注于文件上传而不是密钥对。第二,当我尝试使用它时,我似乎永远不会从.perform()步骤返回。

这是我目前的代码:

import pycurl
import urllib
url='https://xxxxxx.com/xxx-rest'
UAM=pycurl.Curl()

def on_receive(data):
  print data

arglist= [\
    ('username', 'testEmailAdd@test.com'),\
    ('email', 'testEmailAdd@test.com'),\
    ('username','testUserName'),\
    ('givenName','testFirstName'),\
    ('surname','testLastName')]
encodedarg=urllib.urlencode(arglist)
path2= url+"/user/"+"99b47002-56e5-4fe2-9802-9a760c9fb966"
UAM.setopt(pycurl.URL, path2)
UAM.setopt(pycurl.POSTFIELDS, encodedarg)
UAM.setopt(pycurl.SSL_VERIFYPEER, 0)
UAM.setopt(pycurl.UPLOAD, 1) #Set to "PUT"
UAM.setopt(pycurl.CONNECTTIMEOUT, 1) 
UAM.setopt(pycurl.TIMEOUT, 2) 
UAM.setopt(pycurl.WRITEFUNCTION, on_receive)
print "about to perform"
print UAM.perform()

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

还建议

urlliburllib2

答案 2 :(得分:0)

谢谢大家的帮助。我想我找到了答案。

我的代码现在看起来像这样:

import urllib
import httplib
import lxml
from lxml import etree
url='xxxx.com'
UAM=httplib.HTTPSConnection(url)

arglist= [\
    ('username', 'testEmailAdd@test.com'),\
    ('email', 'testEmailAdd@test.com'),\
    ('username','testUserName'),\
    ('givenName','testFirstName'),\
    ('surname','testLastName')\
    ]
encodedarg=urllib.urlencode(arglist)

uuid="99b47002-56e5-4fe2-9802-9a760c9fb966"
path= "/uam-rest/user/"+uuid
UAM.putrequest("PUT", path)
UAM.putheader('content-type','application/x-www-form-urlencoded')
UAM.putheader('accepts','application/com.internap.ca.uam.ama-v1+xml')
UAM.putheader("Content-Length", str(len(encodedarg)))
UAM.endheaders()
UAM.send(encodedarg)
response = UAM.getresponse()
html = etree.HTML(response.read())
result = etree.tostring(html, pretty_print=True, method="html")
print result

更新:现在我收到了有效的回复。这似乎是我的解决方案。 (最后的漂亮印刷品不起作用,但我并不在乎,在构建该功能的时候就是这样。)