Gibt es eine Möglichkeit, eine HTTP-PUT-Anfrage in Python durchzuführen?

Lesezeit: 5 Minuten

Benutzeravatar von Amandasaurus
Amandasaurus

Ich muss einige Daten über HTTP auf einen Server hochladen PUT Methode in Python. Aus meiner kurzen Lektüre des urllib2 docs, es funktioniert nur HTTP POST.

Gibt es eine Möglichkeit, HTTP durchzuführen? PUT in Python?

John Carters Benutzeravatar
John Carter

Ich habe in der Vergangenheit verschiedene Python-HTTP-Bibliotheken verwendet und mich dafür entschieden Anfragen als mein Favorit. Bestehende Bibliotheken verfügten über ziemlich brauchbare Schnittstellen, aber der Code kann für einfache Vorgänge ein paar Zeilen zu lang sein. Eine einfache PUT-In-Anfrage sieht folgendermaßen aus:

payload = {'username': 'bob', 'email': '[email protected]'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)

Anschließend können Sie den Antwortstatuscode überprüfen mit:

r.status_code

oder die Antwort mit:

r.content

Requests enthält viele synaktische Informationen und Verknüpfungen, die Ihnen das Leben erleichtern.

  • Auch wenn der obige Code äußerst einfach aussieht, sollten Sie nicht daraus schließen, dass „Anfragen“ in irgendeiner Weise fehlen oder nicht ausreichend unterstützt werden. Es ist äußerst leistungsfähig, nur mit einer äußerst aufgeräumten Benutzeroberfläche.

    – Jonathan Hartley

    8. Februar 2012 um 18:17 Uhr

  • Ich frage mich, wie lange es dauern wird, bis diese Antwort nach und nach Stimmen sammelt, bis sie zur neuen Antwort mit der höchsten Bewertung wird.

    – Jonathan Hartley

    9. Februar 2012 um 12:27

  • Du verstehst nicht, wie großartig das ist!!! Ich hatte mit einer schäbigen Java-Bibliothek zu kämpfen! … Ich glaube, ich finde es irgendwie toll, dass du auf „Anfragen“ verwiesen hast!

    – Shehaaz

    26. April 2013 um 5:13

  • Verwenden json=payload Parameter, wenn die Daten im Hauptteil enthalten sein sollen.

    – ManuelSchneid3r

    31. März 2017 um 21:06 Uhr


  • Ich möchte schnell darauf hinweisen, dass diese Schnittstelle besser ist als die andere Antwort, da es sich um funktionale Programmierung handelt. Warum ein Objekt erstellen, wenn eine Funktion mit einfachen Datenstrukturen als Parameter ausreicht? Ich wünschte, andere Python-Bibliotheken würden diesem Beispiel folgen.

    – Marc

    1. November 2018 um 18:31 Uhr

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)

  • Sieht nach einem etwas schmutzigen Hack aus, scheint aber elegant und vollständig zu funktionieren

    – Amandasaurus

    22. September 2008 um 9:14

  • Es wäre weniger ein Hack, wenn Sie urllib2.Request in eine Unterklasse umwandeln würden, anstatt es mit Monkey-Patches zu versehen.

    – Jason R. Coombs

    18. Okt. 2011 um 11:59

  • Diese Antwort war brillant, als sie geschrieben wurde, aber heutzutage ist es viel einfacher, stattdessen das Paket „requests“ zu verwenden, siehe Antwort von John Carter. „Requests“ ist keineswegs ein Spielzeug – es ist äußerst leistungsfähig.

    – Jonathan Hartley

    8. Februar 2012 um 18:15 Uhr

  • Diese Antwort ist kanonisch, aber veraltet. Bitte erwägen Sie die Verwendung requests stattdessen die Bibliothek.

    – jsalonen

    25. März 2012 um 17:11 Uhr

  • Vielen Dank, ich wollte nichts außerhalb der Standard-Python-Bibliothek verwenden und das funktioniert perfekt. Ich verstehe nicht ganz, warum urllib2 standardmäßig nur für GET und POST ausgelegt ist, aber dieser Workaround ist der Champion. Kann urllib2.build_opener(urllib2.HTTPHandler) in mehreren Aufrufen wiederverwendet werden?

    – WeNeedAnswers

    16. November 2012 um 1:12


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

  • Verwenden Sie httplib nicht, wenn Sie (oder einer Ihrer potenziellen Benutzer) Proxy-Unterstützung benötigen. Sehen Dieser Artikel für Details.

    – Jason R. Coombs

    18. Okt. 2011 um 11:55

  • Warum würdest du das sagen? In Ihrem Artikel heißt es eindeutig, dass es funktioniert. Sehen Sie sich die Antwort von Rolf Wester an. Er sagt, dass urllib fehlschlägt, httplib jedoch funktioniert.

    – Spulen

    20. Okt. 2011 um 14:41

  • httplib funktioniert nur, wenn der Benutzer explizit eine Verbindung zum Proxy herstellt und die Anforderung so ändert, dass sie die vollständige URL in den GET-Parameter einschließt. Der Grund für das Scheitern von urllib war, dass http_proxy nicht richtig eingestellt war. urllib verwendet httplib unter den Kulissen, verarbeitet aber auch Weiterleitungen, Proxys usw.

    – Jason R. Coombs

    21. Okt. 2011 um 14:54

  • Während diese Lösung funktionieren würde, ist die Verwendung von Anfragen viel einfacher, eleganter und meiner Meinung nach besser.

    – tgrosinger

    29. Juni 2012 um 20:21

  • @tgrosinger Ich stimme zu. Diese Antwort wurde veröffentlicht, bevor Anfragen existierten. Derzeit wäre diese Lösung nur dann besser, wenn nur die Python-Standardbibliothek verfügbar wäre. Ansonsten würde ich auch empfehlen, Anfragen zu verwenden.

    – Spulen

    22. August 2012 um 13:59

Radteks Benutzeravatar
Radtek

Sie können die Requests-Bibliothek verwenden, sie vereinfacht die Dinge im Vergleich zum urllib2-Ansatz erheblich. Installieren Sie es zuerst von pip:

pip install requests

Mehr dazu Anfragen installieren.

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)

Siehe die Schnellstart für die Anforderungsbibliothek. Ich denke, das ist viel einfacher als urllib2, erfordert aber die Installation und den Import dieses zusätzlichen Pakets.

Dies wurde in Python3 verbessert und dokumentiert die stdlib-Dokumentation

Der urllib.request.Request Klasse gewann a method=... Parameter in Python3.

Einige Anwendungsbeispiele:

req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)

John Montgomerys Benutzeravatar
John Montgomery

Das sollten Sie sich mal ansehen httplib-Modul. Damit sollten Sie jede gewünschte HTTP-Anfrage stellen können.

Mikes Benutzeravatar
Mike

Ich musste vor einiger Zeit auch dieses Problem lösen, damit ich als Client für eine RESTful-API fungieren konnte. Ich habe mich für httplib2 entschieden, weil ich damit neben GET und POST auch PUT und DELETE senden konnte. Httplib2 ist nicht Teil der Standardbibliothek, kann aber problemlos im Käseladen bezogen werden.

  • httplib2 ist grenzwertige Abandonware. Es gibt eine lange Liste von Fehlern, die trotz Community-Beiträgen (Patches) nicht behoben werden. Ich empfehle, zweimal darüber nachzudenken, bevor Sie httplib2 in Produktionsumgebungen verwenden.

    – Jason R. Coombs

    18. Okt. 2011 um 11:58

1450190cookie-checkGibt es eine Möglichkeit, eine HTTP-PUT-Anfrage in Python durchzuführen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy