Відповіді:
У минулому я використовував різні версії python HTTP, і я зупинився на " Запити " як свого улюбленого. Існуючі лібри мали досить корисні інтерфейси, але код може закінчитися декількома рядками занадто довгими для простих операцій. Основний PUT у запитах виглядає так:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Потім ви можете перевірити код статусу відповіді за допомогою:
r.status_code
або відповідь:
r.content
У запитах багато синактичного цукру та ярликів, які полегшать ваше життя.
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, який ви хочете.
Мені потрібно було ще раз вирішити цю проблему, щоб я міг виступати клієнтом API RESTful. Я влаштувався на httplib2, тому що це дозволило мені надсилати PUT і DELETE на додаток до GET та POST. Httplib2 не входить до стандартної бібліотеки, але ви можете легко отримати його в магазині сирів.
Ви можете використовувати бібліотеку запитів, це значно спрощує речі порівняно з підходом 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, але він потребує встановлення та імпорту цього додаткового пакета.
Це було зроблено краще в 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.
Звичайно, ви можете згорнути власні файли з існуючими стандартними бібліотеками на будь-якому рівні, починаючи від сокетів до налаштування URL-адреси.
http://pycurl.sourceforge.net/
"PyCurl - це інтерфейс Python для лібкурлу."
"libcurl - це безкоштовна і проста у використанні бібліотека передачі URL-адрес на стороні клієнта, ... підтримує ... HTTP PUT"
"Основним недоліком PycURL є те, що він є відносно тонким шаром над libcurl без будь-якої з цих приємних ієрархій класів Pythonic. Це означає, що він має дещо круту криву навчання, якщо ви вже не знайомі з API C 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 є помилка.