Antworten:
Ich habe in der Vergangenheit eine Vielzahl von Python-HTTP-Bibliotheken verwendet und mich für " Anfragen " als meinen Favoriten entschieden. Bestehende Bibliotheken hatten ziemlich brauchbare Schnittstellen, aber Code kann für einfache Operationen einige Zeilen zu lang sein. Ein grundlegender PUT in Anfragen sieht folgendermaßen aus:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Sie können den Antwortstatuscode dann überprüfen mit:
r.status_code
oder die Antwort mit:
r.content
Requests enthält viele synaktische Zucker und Verknüpfungen, die Ihnen das Leben erleichtern.
json=payload
Parameter, wenn sich die Daten im Body befinden sollen.
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
stattdessen die Verwendung einer Bibliothek.
Httplib scheint eine sauberere Wahl zu sein.
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
Sie sollten sich das httplib-Modul ansehen . Sie sollten die gewünschte HTTP-Anfrage stellen können.
Ich musste dieses Problem auch vor einiger Zeit lösen, damit ich als Client für eine RESTful-API fungieren konnte. Ich habe mich für httplib2 entschieden, weil ich damit zusätzlich zu GET und POST auch PUT und DELETE senden konnte. Httplib2 ist nicht Teil der Standardbibliothek, kann aber problemlos im Käsegeschäft bezogen werden.
Sie können die Anforderungsbibliothek verwenden. Sie vereinfacht die Arbeit im Vergleich zum urllib2-Ansatz erheblich. Installieren Sie es zuerst von pip:
pip install requests
Weitere Informationen zum Installieren von Anforderungen .
Richten Sie dann die Put-Anfrage ein:
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)
Informationen zur Anforderungsbibliothek finden Sie im Schnellstart . Ich denke, dies ist viel einfacher als urllib2, erfordert jedoch die Installation und den Import dieses zusätzlichen Pakets.
Dies wurde in Python3 verbessert und in der stdlib-Dokumentation dokumentiert
Die urllib.request.Request
Klasse hat einen method=...
Parameter in Python3 erhalten.
Einige Beispiele für die Verwendung:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
Ich empfehle auch httplib2 von Joe Gregario. Ich benutze dies regelmäßig anstelle von httplib in der Standardbibliothek.
Haben Sie sich put.py angesehen ? Ich habe es in der Vergangenheit benutzt. Sie können auch einfach Ihre eigene Anfrage mit urllib hacken.
Sie können natürlich Ihre eigenen mit den vorhandenen Standardbibliotheken auf jeder Ebene von Sockets bis zur Optimierung von urllib rollen.
http://pycurl.sourceforge.net/
"PyCurl ist eine Python-Schnittstelle zu libcurl."
"libcurl ist eine kostenlose und benutzerfreundliche clientseitige URL-Übertragungsbibliothek, ... unterstützt ... HTTP PUT"
"Der Hauptnachteil von PycURL ist, dass es eine relativ dünne Schicht über libcurl ohne diese netten Pythonic-Klassenhierarchien ist. Dies bedeutet, dass es eine etwas steile Lernkurve hat, es sei denn, Sie sind bereits mit der C-API von libcurl vertraut."
Wenn Sie in der Standardbibliothek bleiben möchten, können Sie folgende Unterklassen erstellen 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)
Ein geeigneterer Weg, dies zu tun, requests
wäre:
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
Dies löst eine Ausnahme aus, wenn in der HTTP-PUT-Anforderung ein Fehler vorliegt.