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

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

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

Softwareanforderungen und Linux -Befehlszeilenkonventionen
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…