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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top