Gibt es eine Möglichkeit HTTP PUT in Python zu tun
Frage
Ich brauche einige Daten an einen Server über HTTP PUT
in Python zu laden. Aus meiner kurzen Lesung der urllib2 docs, tut es nur HTTP POST
. Gibt es eine Möglichkeit, um eine HTTP PUT
in Python zu tun?
Lösung
Ich habe eine Vielzahl von Python HTTP-Libs in der Vergangenheit, und ich habe angesiedelt auf ‚ Anfragen ‘als mein Favorit. Bestehende Libs hatte ziemlich nutzbare Schnittstellen, aber Code kann sein, ein paar Zeilen zu lang für einfache Operationen enden. Eine grundlegende PUT in Anfragen wie folgt aussieht:
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
Sie können dann überprüfen Sie den Antwortstatuscode mit:
r.status_code
oder die Antwort mit:
r.content
Anfragen haben viele synactic Zucker und Verknüpfungen, die das Leben leichter machen werden.
Andere Tipps
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 scheint wie eine sauberere Wahl.
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 einen Blick auf die httplib Modul . Es sollte Sie machen lassen, was Art von HTTP-Anforderung Sie wollen.
Ich brauchte auch dieses Problem eine Weile zurück zu lösen, so dass ich als Client für eine RESTful API handeln könnte. Ich ließ mich auf httplib2, weil es mir erlaubt PUT zu senden und DELETE neben GET und POST. Httplib2 ist nicht Teil der Standardbibliothek, aber man kann es leicht aus dem Käseladen bekommen.
Sie können die Anfragen Bibliothek verwenden, es vereinfacht die Dinge viel im Vergleich der urllib2 Ansatz zu nehmen. Zuerst installieren Sie es von pip:
pip install requests
Mehr Installation Anfragen .
Dann richten Sie die Put-Anfrage:
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)
Sehen Sie die quickstart für Anfragen Bibliothek . Ich denke, das viel einfacher als urllib2 ist aber dieses zusätzliche Paket erfordert installiert und importiert werden.
Das war besser in python3 und dokumentiert in der stdlib Dokumentation gemacht
Die urllib.request.Request
Klasse gewann einen method=...
Parameter in python3.
Einige Beispiel Nutzung:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
ich auch empfehlen httplib2 von Joe Gregario. Ich benutze diese regelmäßig statt httplib im Standard-lib.
Haben Sie einen Blick auf put.py ? Ich habe es in der Vergangenheit verwendet. Sie können auch einfach Ihren eigenen Wunsch mit urllib zerhacken.
Sie können Ihre eigenen mit den bestehenden Standardbibliotheken auf jeder Ebene natürlich rollt von Steckdosen bis urllib zu zwicken.
http://pycurl.sourceforge.net/
"pycurl ist eine Python-Schnittstelle Libcurl."
"libcurl eine kostenlose und einfach zu bedien ist clientseitige URL Transfer Bibliothek, ... unterstützt ... HTTP PUT"
„Der Hauptnachteil mit pycurl ist, dass es sich um eine relativ dünne Schicht über libcurl ist ohne eine dieser netten Pythonic Klassenhierarchien. Das bedeutet, es eine etwas steile Lernkurve hat, wenn Sie bereits vertraut sind mit libcurl der C-API.“
Wenn Sie innerhalb der Standardbibliothek bleiben möchten, können Sie urllib2.Request
Unterklasse:
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)