我需要在python中使用HTTP PUT上传一些数据到服务器。从我对urllib2文档的简要阅读来看,它只执行HTTP POST。有没有办法在python中做一个HTTP PUT ?


当前回答

当然,您可以在任何级别上使用现有的标准库,从套接字到调整urllib。

http://pycurl.sourceforge.net/

PyCurl是libcurl的Python接口。

libcurl是一个免费且易于使用的客户端URL传输库,…支持……HTTP PUT”

“PycURL的主要缺点是它相对于libcurl来说是一个相对较薄的层,没有任何漂亮的python类层次结构。这意味着它有一个陡峭的学习曲线,除非你已经熟悉libcurl的C API。”

其他回答

我还推荐Joe Gregario编写的httplib2。我经常使用这个而不是标准库中的httplib。

你看过put.py吗?我以前用过。你也可以用urllib修改你自己的请求。

如果希望留在标准库中,可以继承urllib2。要求:

import urllib2

class RequestWithMethod(urllib2.Request):
    def __init__(self, *args, **kwargs):
        self._method = kwargs.pop('method', None)
        urllib2.Request.__init__(self, *args, **kwargs)

    def get_method(self):
        return self._method if self._method else super(RequestWithMethod, self).get_method()


def put_request(url, data):
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    request = RequestWithMethod(url, method='PUT', data=data)
    return opener.open(request)

这在python3中做得更好,并在stdlib文档中进行了记录

urllib.request.Request类获得一个方法=…参数。

一些示例用法:

req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)

您可以使用请求库,与采用urllib2方法相比,它简化了很多事情。首先从pip安装它:

pip install requests

更多关于安装请求的信息。

然后设置put请求:

import requests
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}

# Create your header as required
headers = {"content-type": "application/json", "Authorization": "<auth-key>" }

r = requests.put(url, data=json.dumps(payload), headers=headers)

请参阅请求库的快速入门。我认为这比urllib2简单得多,但确实需要安装和导入这个额外的包。