Мне нужно загрузить некоторые данные на сервер, используя HTTP PUT
в python. Из моего краткого чтения документов urllib2 он только HTTP POST
. Есть ли способ сделать HTTP PUT
в python?
Есть ли способ сделать HTTP PUT в python
Ответ 1
В прошлом я использовал множество HTTP-библиотек python, и я поселился в Requests как мой любимый. Существующие библиотеки имеют довольно полезные интерфейсы, но код может оказаться слишком длинным для простых операций. Базовый PUT в запросах выглядит так:
payload = {'username': 'bob', 'email': '[email protected]'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Затем вы можете проверить код состояния ответа:
r.status_code
или ответ с помощью:
r.content
В запросах есть много синактического сахара и ярлыков, которые облегчат вашу жизнь.
Ответ 2
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)
Ответ 3
Httplib кажется более чистым выбором.
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
Ответ 4
Вам следует взглянуть на модуль httplib. Он должен позволить вам сделать любой желаемый HTTP-запрос.
Ответ 5
Мне нужно было решить эту проблему слишком долго, чтобы я мог выступать в качестве клиента для RESTful API. Я поселился на httplib2, потому что это позволило мне отправить PUT и DELETE в дополнение к GET и POST. Httplib2 не входит в стандартную библиотеку, но вы можете легко получить его из магазина сыра.
Ответ 6
Вы можете использовать библиотеку запросов, это упрощает многое по сравнению с использованием подхода 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)
См. quickstart для библиотеки запросов. Я думаю, что это намного проще, чем urllib2, но требует, чтобы этот дополнительный пакет был установлен и импортирован.
Ответ 7
Я также рекомендую Joe Gregario httplib2. Я использую это регулярно вместо httplib в стандартной библиотеке lib.
Ответ 8
Вы взглянули на put.py? Я использовал его в прошлом. Вы также можете просто взломать свой собственный запрос с помощью urllib.
Ответ 9
Вы можете, конечно, свернуть свои собственные с существующими стандартными библиотеками на любом уровне от сокетов до настройки urllib.
http://pycurl.sourceforge.net/
"PyCurl - это интерфейс Python для libcurl".
"libcurl - бесплатная и простая в использовании клиентская библиотека для передачи URL-адресов,... поддерживает... HTTP PUT"
"Главный недостаток PycURL заключается в том, что он является относительным тонким слоем над libcurl без каких-либо из этих хороших иерархий классов Pythonic. Это означает, что он имеет несколько крутую кривую обучения, если вы уже не знакомы с libcurl C API".
Ответ 10
Если вы хотите остаться в стандартной библиотеке, вы можете подклассом 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)