Das Titelthema im ADMIN 04/14 "Vernetzt speichern" sind Netzwerkdateisysteme, etwa Samba 4, verteilter Storage mit Ceph & GlusterFS und der Unix-Klassiker ... (mehr)

Antworten

Den Inhalt der von HTTP-Anfragen zurückgegebenen Response-Objekte enthält deren Attribut »text« im Rohtext. Im »content« -Attribut hält das Response-Objekt die Antwortdaten Byte für Byte vor. Das ist hilfreich, falls es sich beim Inhalt um Binärdaten statt um Text handelt, beispielsweise um Bilder. Fürs Json-Format bringt Requests einen passenden Parser mit: Die »json()« -Methode eines Reponse-Objekts bereitet den Inhalt als Python-Dictionary auf.

Standardmäßig holt ein HTTP-Request die Antwort direkt vollständig vom Server ab. Setzt man den Parameter »stream« auf »True« , wartet die Response-Klasse damit, bis man über das »content« -Attribut den Inhalt abruft. Das eröffnet die Möglichkeit, die Antwort stückchenweise und auf Wunsch auch direkt vom Socket abzuholen, etwa mit »r.raw.read(Bytes)« .

»r.iter_content()« und »r.iter_lines()« liefern daneben Iteratoren, die eine Antwort Byte- beziehungsweise zeilenweise durchlaufen. Das Beispiel in Listing 1 holt die Antwort in 64 Byte großen Einzelteilen und schreibt sie nacheinander in eine Datei »index.html« .

Listing 1

Stückchenweiser Abruf einer Datei

 

Streaming funktioniert auch in die andere Richtung. Beim Hochladen von Daten mit »post()« übergibt man lediglich dem »data« -Parameter ein geöffnetes »File« -Objekt. Dann lädt »post()« dessen gesamten Inhalt nach und nach hoch:

post(URL, data=open("bild.png"))

Alternativ nimmt der »data« -Parameter ein »Generator« -Objekt entgegen; auch ein Iterator ist hier erlaubt, wenn er keine feste Länge definiert. Die »post()« -Methode hat damit die Möglichkeit den Generator beziehungsweise Iterator immer wieder aufzurufen und jedes Ergebnis als separate Einheit an den Server zu schicken.

Im Detail

Ein HTTP-Server schickt als Teil seiner Antwort auf eine Anfrage stets einen Status-Code mit. Das Attribut »status_code« eines Response-Objekts verrät dieses Ergebnis. War bei einem Aufruf alles in Ordnung, enthält »r.status_code« den Wert 200. Bei fehlgeschlagenen Zugriffsversuchen beginnt der Antwort-Code mit 4 oder 5. Die »Response« -Methode »raise_for_status()« verwendet den Status-Code und löst im Fehlerfall eine »HTTPError« -Exception aus. Sie kommt deshalb zum Prüfen des Verbindungsstatus mit Try-Except-Konstruktionen zum Einsatz.

Die Kopfzeilen der HTTP-Antwort eines Servers führt das »headers« -Attribut eines Response-Objekts auf (siehe Abbildung 1). Im abgebildeten Beispiel verrät die Zeile »set-cookie« bereits, dass der Server dem Client einen Cookie geschickt hat. Ihn hält das Attribut »cookies« in einem Objekt der Klasse »requests.cookies.RequestsCookieJar« vor, das als Behälter für »Cookie« -Objekte dient.

Abbildung 1: Das Response-Objekt r speichert alle Eigenschaften einer Antwort vom Server.

Die Methode »get()« eines Objekts der Klasse »RequestsCookieJar« holt unter Angabe des Cookie-Namens die einzelnen Kekse in die Dose. Wie bei einem Dictionary zeigt die »keys()« -Methode der gleichen Klasse alle verfügbaren Cookie-Namen an. Auch andere Methoden wie »values()« , »items()« , »iteritems()« , »iterkeys()« und »itervalues()« funktionieren bei RequestsCookieJar-Objekten auf die gleiche Weise wie bei Dictionaries.

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019