Ответы:
В прошлом я использовал различные библиотеки Python HTTP, и я остановился на « Запросах », как на моем любимом. Существующие библиотеки имели довольно удобные интерфейсы, но в итоге код может оказаться слишком длинным для простых операций. Базовый PUT в запросах выглядит так:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Затем вы можете проверить код статуса ответа с помощью:
r.status_code
или ответ с:
r.content
В Requests много синактического сахара и ярлыков, которые сделают вашу жизнь проще.
json=payload
параметр, если вы хотите, чтобы данные были в теле.
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)
requests
библиотеки.
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
Вы должны взглянуть на модуль httplib . Он должен позволять вам делать любые запросы HTTP.
Некоторое время назад мне нужно было решить эту проблему, чтобы я мог выступать в роли клиента для RESTful API. Я остановился на httplib2, потому что это позволило мне отправлять PUT и DELETE в дополнение к GET и POST. 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, но требует установки и импорта этого дополнительного пакета.
Это было улучшено в python3 и задокументировано в документации stdlib
urllib.request.Request
Класс получил method=...
параметр в Python3.
Пример использования:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Я также рекомендую httplib2 Джо Грегарио. Я использую это регулярно вместо httplib в стандартной lib.
Вы посмотрели на put.py ? Я использовал это в прошлом. Вы также можете просто взломать свой собственный запрос с помощью urllib.
Конечно, вы можете свернуть свои собственные существующие библиотеки на любом уровне, от сокетов до настройки urllib.
http://pycurl.sourceforge.net/
«PyCurl - это интерфейс Python для libcurl».
«libcurl - это бесплатная и простая в использовании клиентская библиотека для передачи URL, ... поддерживает ... HTTP PUT»
«Основным недостатком PycURL является то, что он является относительно тонким слоем по сравнению с libcurl без какой-либо из этих хороших иерархий классов Pythonic. Это означает, что у него довольно крутая кривая обучения, если вы уже не знакомы с C API libcurl».
Если вы хотите остаться в стандартной библиотеке, вы можете создать подкласс 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)
Более правильный способ сделать это с requests
:
import requests
payload = {'username': 'bob', 'email': 'bob@bob.com'}
try:
response = requests.put(url="http://somedomain.org/endpoint", data=payload)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
raise
Это вызывает исключение, если в запросе HTTP PUT есть ошибка.