So führen Sie HTTP -Anfragen mit Python - Teil 2 - der Anforderungsbibliothek durch

- 2093
- 594
- Aileen Dylus
Im vorherigen Artikel haben wir gesehen, wie grundlegende HTTP. Wenn Anfragen komplexer werden oder wir nur weniger Code verwenden möchten und es uns nichts ausmacht, unserem Projekt eine Abhängigkeit hinzuzufügen, ist es möglich (und manchmal sogar empfohlen), das externe zu verwenden Anfragen
Modul. Die Bibliothek, die das Motto „HTTP for Humans“ übernommen hat, wird im Mittelpunkt dieses Artikels stehen.
In diesem Tutorial lernen Sie:
- So führen Sie HTTP -Anfragen mit Python3 und der "Anfragen" -Bibliothek durch
- So verwalten Sie Serverantworten
- Wie man mit Sitzungen arbeitet

HTTP -Anfragen mit Python - Pt. II: Die Anfragenbibliothek
Softwareanforderungen und Konventionen verwendet
Kategorie | Anforderungen, Konventionen oder Softwareversion verwendet |
---|---|
System | OS-unabhängig |
Software | Python3 und die "Anfragen" -Bibliothek |
Andere | Kenntnis der grundlegenden Konzepte objektorientierter Programmierung und Python |
Konventionen | # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können |
Anfragen mit der "Anfragen" -Bibliothek durchführen
Im ersten Teil dieser Serie haben wir grundlegende HTTP -Anforderungen nur mit der Standardbibliothek durchgeführt. Wenn Anfragen komplexer werden, können wir das verwenden, wenn wir Cookies zwischen einer Anfrage und einer anderen bewahren müssen, können wir die verwenden Anfragen
Externe Bibliothek, die unseren Job vereinfacht und viele Operationen unter der Motorhaube für uns ausführt. Da die Bibliothek nicht in einer Standard -Python3 -Installation enthalten ist, müssen wir sie auf unserem System installieren, bevor wir sie verwenden können. Eine verteilungsunabhängige Methode zur Erfüllung der Aufgabe ist die Verwendung Pip
, Der Python -Paketmanager:
$ pip3 Installieren Sie Anfragen -Benutzerärzte
Nachdem wir die Bibliothek installiert haben, sehen wir einige Beispiele für die Verwendung.
Eine Get -Anfrage durchführen
Denken Sie an die Anfrage, die wir mit den NASA -APIs gestellt haben, um das „Bild des Tages“ für ein bestimmtes Datum abzurufen? Aufbau und Senden der gleichen Anfrage mit dem Anfragen
Die Bibliothek erfordert nur eine Codezeile:
>>> Anfragen importieren >>> Antwort = Anfragen.Get ("https: // api.NASA.gov/Planetary/apod ", params = " api_key ":" Demo_key "," Datum ":" 2019-04-11 ")
Kopieren Wir haben die URL- und die Abfrageparameter (immer noch als Wörterbuch) als erster und zweites Argument der erhalten
Funktion. Was kehrt diese Funktion zurück?? Es gibt eine Instanz der zurück Anfragen.Modelle.Antwort
Klasse. Das Interaktion mit Instanzen dieser Klasse ist sehr einfach. Wollen wir den JSON-kodierten Inhalt der Antwort abrufen?? Einfach! Wir müssen nur das anrufen JSON
Methode des Objekts:
>>> Antwort.JSON () 'Date': '2019-04-11', 'Erklärung': 'Wie sieht ein schwarzes Loch aus? Um herauszufinden, dass Radio -Teleskope aus der Erde die Beobachtungen von "schwarzen Löchern mit den größten bekannten Ereignishorizonten auf der" koordinierten ... 'unmittelbare Nähe des Schwarzen Lochs in der Mitte unserer milchigen Galaxie.',' hdurl ':' https: // apod.NASA.GOV/APOD/Image/1904/M87BH_EHT_2629.JPG ',' media_type ':' Bild ',' service_version ':' v1 ',' title ':' Erster Horizon-Scale-Bild eines schwarzen Lochs ',' url ':' https: // apod.NASA.GOV/APOD/Image/1904/M87BH_EHT_960.JPG '
Kopieren Wollen wir die Antwort des Servers als Zeichenfolge erhalten?? Wir müssen nur auf die zugreifen Text
Eigentum:
Antwort.Text
Auf die gleiche Weise können wir zum Zugang zum Grund
, Statuscode
Und Header
der Anfrage. Wir müssen nur auf die jeweiligen Eigenschaften zugreifen:
>>> Antwort.Grund 'OK' >>> Antwort.Status_code 200 >>> Antwort.Header 'Server': 'OpenResty', 'Date': 'Thu, 18. April 2019 10:46:26 GMT', 'Inhaltstyp': 'Anwendung/JSON', 'Transfer-Coding': 'Chunked',, "Verbindung": "Keep-Alive", "Variable": "Akzeptieren-kodierend", "x-ratelimit-limit": "40", "x-ratelimit-remaining": "39", "via": "1.1 Vegur, http/1.1 api-umbrella (apachetrafficserver [CMSSF]) ',' Alter ':' 0 ',' X-Cache ':' Miss ',' Access-Control-Owl-Owl-Origin ':'*',' Strict-Transport-Security ':' max-alalter = 31536000; Vorspannung ',' Inhaltskodierung ':' Gzip '
Kopieren Herunterladen einer Datei
Das Herunterladen einer Datei ist auch sehr einfach. Zunächst müssen wir die verwenden Strom
Parameter der erhalten
Funktion. Standardmäßig wird dieser Parameter auf eingestellt FALSCH
, und dies bedeutet, dass der Körper der Antwort sofort heruntergeladen wird. Da wir vielleicht eine große Datei herunterladen möchten, möchten wir sie darauf einstellen WAHR
: Auf diese Weise werden nur die Header der Antwort sofort heruntergeladen und die Verbindung bleibt offen, sodass wir sie weiter verarbeiten können, wie wir es wollen:
>>> neuest_kernel_tarball = "https: // cdn.Kernel.org/pub/linux/kernel/v5.X/Linux-5.0.7.Teer.XZ ">>> mit Anfragen.Get (neuest_kernel_tarball, stream = true) als Antwort: ... mit Open ("neuestes Kernel.Teer.xz "," wb ") als Tarball: ... als Antwort als Antwort.iter_content (16384): ... Tarball.Schreiben Sie (Chunk)
Kopieren Der Code ähnelt dem Gegenstück zur Standardbibliothek: Das, was sich geändert hat, ist die Verwendung des ITER_CONTENT
Methode des Antwortobjekts. Im vorherigen Beispiel haben wir in einer Weile die Schleife betrieben, die wir nur unterbrochen haben, wenn der Inhalt der Antwort verbraucht wurde. Mit dieser Methode können wir auf elegantere Weise in die Zieldatei schreiben, da wir den Inhalt der Antwort itererieren können. Der ITER_CONTENT
Die Methode akzeptiert das optionale Argument Chunk_Size
, ein ganze Zahl
Zeigen Sie die Stücke in Bytes an (die Daten, die bei jeder Iteration im Speicher gelesen werden sollen).
Senden von formkodierten Daten oder JSON in einer Anfrage
Senden von Formularkodierdaten (z. B. in einer Postanforderung) mit der Bibliothek „Anforderungen“ benötigt weniger Code als dieselbe Operation, die nur mit der Standardbibliothek ausgeführt wird:
>>> request_data = ... "variable1": "value1", ... "variable2": "value2" ... >>> Antwort = Anfragen.post ("https: // httpbin.org/post ", data = request_data)
Kopieren Die gleichen Daten zu übergeben, aber als JSON:
Antwort = Anfragen.post ("https: // httpbin.org/post ", json = request_data)
Durch Verwendung der JSON
Parameter der Funktion müssen wir uns nicht einmal Sorgen machen, die Zeichenfolge zu codieren JSON.Dumps
: Es wird für den Einsatz unter der Motorhaube geschehen.
Hochladen einer Datei
Das Hochladen einer Datei mithilfe der Standardbibliothek kann eine sehr mühsame Aufgabe sein, aber es ist sehr einfach, die zu verwenden Anfragen
Bibliothek. Sagen Sie, wir wollen ein Bild hochladen:
>>> Antwort = Anfragen.Post( ... "https: // httpbin.org/post ", file = 'Datei': öffnen ('nasa_black_hole.png ',' rb '))
Kopieren Beeindruckend kurzer Code! Wir haben a durchgeführt Post
Anfrage, diesmal mit dem Dateien
Streit. Dieses Argument muss ein Wörterbuch sein, in dem der Schlüssel das Feld „Name“ ist und der Wert ein Dateiobjekt ist, in diesem Fall, der von dem zurückgegeben wird offen
Funktion.
Was ist mit den anderen HTTP -Verben? Jeder von ihnen wird mit der entsprechend benannten Funktion verwendet: setzen
, löschen
, Kopf
oder Optionen
. Alle von ihnen können im Grunde genommen mit der gleichen Schnittstelle verwendet werden wie die, die wir zuvor gesehen haben.
Arbeiten mit Sitzungen
Der Anfragen
Die Bibliothek ermöglicht es uns zu verwenden Sitzungen
: Wenn Anfragen aus einem Sitzungskontext gesendet werden, bleiben Cookies zwischen einer Anfrage und einer anderen erhalten. Dies ist die empfohlene Methode, um mehrere Anfragen an denselben Host auszuführen, da selbst dieselben TCP
Die Verbindung wird wiederverwendet. Lassen Sie uns sehen, wie Sie eine Sitzung erstellen und eine Anfrage damit senden:
>>> Session = Anfragen.Session () >>> Antwort = Sitzung.get ("https: // httpbin.org/cookies/set?LastName = Skywalker ")
Kopieren Wir haben eine Instanz der erstellt Anfragen.Sitzung
Klasse, und anstatt eine Anfrage für sich auszuführen, wie wir es in früheren Beispielen getan haben, haben wir die nach dem HTTP -Verb benannte Methode verwendet ((erhalten
in diesem Fall), der auf die gleiche Weise verwendet wird. Die Anfrage -URL war diesmal http: // httpbin.org/cookies/set, ein Endpunkt, mit dem wir die Cookie -Parameter einstellen können, die wir in der Abfragezeichenfolge senden. Der Anruf, den wir getätigt haben, setzen einen Cookie, der jetzt in der Sitzung gespeichert ist, und wird in allen Anfragen verwendet, Sitzung
Kontext. Um alle mit einer Sitzung verknüpften Cookies aufzulisten, können wir auf die zugreifen Kekse
Eigentum, das eine Instanz der ist Anfragen.Kekse.RequestsCookiejar '
Klasse:
>>> Sitzung.Kekse >>> # Greifen Sie auf die Cookies -Schlüssel zu ...Sitzung.Kekse.Keys () ['LastName'] >>> >>> # Zugriff auf die Cookies -Werte zugreifen ...Sitzung.Kekse.values () ['Skywalker'] >>> >>> # Die Iterkeys -Methode gibt einen Iterator von Namen von Cookies zurück ...Sitzung.Kekse.Iterkeys () >>> # Die Itervalues -Methode macht dasselbe, aber für Werte ...Sitzung.Kekse.Itervalues ()
Kopieren Um gespeicherte Cookies in der Sitzung zu reinigen, können wir die verwenden klar
Methode:
>>> Sitzung.Kekse.Clear () >>> Sitzung.Kekse
Kopieren Erstellen Sie ein Anforderungsobjekt
Bis jetzt haben wir nur Funktionen wie verwendet wie erhalten
, Post
oder setzen
im Grunde erstellen und senden Sie Anfragen "on the Fly". Es gibt Fälle, in denen wir a bauen wollen Anfrage
Objekt, aber wir wollen es nicht sofort senden. So können wir es schaffen:
>>> Request = Anfragen.Anfrage ("get", "https: // httpbin.org/get ")
Das erste Argument der Anfrage
Der Konstruktor ist das Verb, das wir verwenden möchten, und das zweite, die Ziel -URL. Die gleichen Parameter, die wir verwenden, wenn wir eine direkte Anfrage senden, können verwendet werden: Header
, Parameter
, Daten
, JSON
Und Dateien
. Sobald wir a erstellt haben Anfrage
Wir müssen es „vorbereiten“, bevor wir es senden können:
>>> Session = Anfragen.Session () >>> Request = Anfragen.Anfrage ("get", "https: // httpbin.org/get ") >>> Preped_request = Sitzung.prepe_request (Anfrage) >>> Antwort = Sitzung.senden (vorbereitet_request)
Kopieren Wir könnten auch eine vorbereiten Anfrage
Verwendung der vorbereiten
Methode der Anfrage
Objekt selbst anstatt anzurufen Sitzung.vorbereiten_request
, In diesem Fall würde der Antrag jedoch die Vorteile des Teils der Sitzung verlieren.
Erhöhen Sie eine Ausnahme, wenn der Antwortstatuscode nicht 200 ist
Der Statuscode, der von einem Server zurückgegeben wird, wenn eine Anforderung erfolgreich ist 200
. Wenn ein Fehler auftritt, beispielsweise wenn eine Ressource nicht gefunden wird oder wenn wir nicht zugänglich sind, werden andere Codes zurückgegeben (in diesem Fall 404 bzw. 403). Wenn dies geschieht und wir möchten, dass unser Code eine Ausnahme anzieht, müssen wir das anrufen raise_for_status
Methode der Anfragen.Modelle.Antwort
Objekt. Mal sehen, wie sich der Code anders verhält, wenn wir ihn verwenden. Wir senden eine Postanfrage an einen Endpunkt, der nur das GET -Verb akzeptiert:
>>> Antwort = Anfragen.post ('https: // httpbin.org/get ') >>> Antwort.STATUS_CODE 405 >>> Antwort.Grund "Methode nicht erlaubt"
Kopieren Wie erwartet, war der Antwortstatuscode, da wir das falsche HTTP -Verb verwendeten, der Antwortstatuscode 405
, und der entsprechende „Grund“ ist METHODE NICHT ERLAUBT
, Es wurde jedoch keine Ausnahme erhoben. Eine schlechte Anfrage auf eine schlechte Anfrage erheben zu lassen Ausnahme
Wir müssen das anrufen raise_for_status
Methode nach dem Senden der Anfrage:
>>> Antwort = Anfragen.post ('https: // httpbin.org/get ') >>> Antwort.RAUS_FOR_STATUS () TraceBack (letztes Anruf letztes): Datei "", Zeile 1, in der Datei "/usr/lib/python3.7/Site-Packages/Anfragen/Modelle.Py ", Zeile 940, in Raise_For_status Raise httperror (http_error_msg, response = self) Anforderungen.Ausnahmen.Httperror: 405 Client -Fehler: Methode für URL nicht zulässig: https: // httpbin.org/bekommen
Kopieren Da haben wir angerufen raise_for_status
, Diesmal erhöhte die Anfrage eine Anfragen.Ausnahmen.HTTP Fehler
Ausnahme.
Schlussfolgerungen
In diesem Artikel, der zweite der Serien über die Ausführung der HTTP -Anfrage mit Python, konzentrierten wir uns
Bei der Verwendung des externen Anfragen
Bibliothek, mit der wir sowohl einfache als auch komplexe Anfragen ausführen können
In wenigen Codezeilen. Ich möchte mehr darüber wissen? Die offizielle Dokumentation ist nur einen Klick entfernt!
Verwandte Linux -Tutorials:
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- So richten Sie einen OpenVPN -Server auf Ubuntu 20 ein.04
- Mastering -Bash -Skriptschleifen beherrschen
- Wie man mit der Woocommerce -REST -API mit Python arbeitet
- Dinge zu installieren auf Ubuntu 20.04
- Mint 20: Besser als Ubuntu und Microsoft Windows?
- Verschachtelte Schleifen in Bash -Skripten
- So erstellen Sie eine Tkinter -Anwendung mithilfe eines objektorientierten…
- Hung Linux System? Wie man zur Befehlszeile entkommt und…
- So starten Sie externe Prozesse mit Python und dem…
- « So führen Sie HTTP -Anfragen mit Python - Teil 1 der Standardbibliothek durch
- So führen Sie HTTP -Anfragen mit Python durch »