有没有办法在python中执行HTTP PUT

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

过去,我使用了各种各样的python HTTP库,并且以“我的最爱”的forms解决了“ 请求 ”问题。 现有的库有相当可用的接口,但是对于简单的操作,代码最终可能只有几行太长。 请求中的基本PUT如下所示:

 payload = {'username': 'bob', 'email': 'bob@bob.com'} >>> r = requests.put("http://somedomain.org/endpoint", data=payload) 

然后您可以通过以下方式检查响应状态码:

 r.status_code 

或者回应:

 r.content 

要求有很多synactic糖和捷径,会让你的生活更轻松。

 import urllib2 opener = urllib2.build_opener(urllib2.HTTPHandler) request = urllib2.Request('http://example.org', data='your_put_data') request.add_header('Content-Type', 'your/contenttype') request.get_method = lambda: 'PUT' url = opener.open(request) 

Httplib似乎是一个更清洁的select。

 import httplib connection = httplib.HTTPConnection('1.2.3.4:1234') body_content = 'BODY CONTENT GOES HERE' connection.request('PUT', '/url/path/to/put/to', body_content) result = connection.getresponse() # Now result.status and result.reason contains interesting stuff 

你应该看看httplib模块 。 它应该让你做任何你想要的HTTP请求。

我需要一段时间来解决这个问题,以便我可以充当RESTful API的客户端。 我解决了httplib2,因为它允许我除了GET和POST之外还发送PUT和DELETE。 Httplib2不是标准库的一部分,但你可以从奶酪店轻松获得。

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

 pip install requests 

更多关于安装请求 。

然后设置放置请求:

 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简单得多,但是需要安装和导入这个额外的软件包。

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

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

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

http://pycurl.sourceforge.net/

“PyCurl是libcurl的Python接口。”

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

“PycURL的主要缺点是它比libcurl更薄,没有任何Pythonic类层次结构,这意味着它有一个陡峭的学习曲线,除非你已经熟悉libcurl的C API。

如果你想留在标准库中,你可以urllib2.Request

 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)