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

Vom Abruf zur Sitzung

Cookies wurden entwickelt, um HTTP-Sitzungen zu ermöglichen, in denen ein Web-Server die Besucher seiner Seite wiedererkennt. Das erlaubt dem Client und dem Server miteinander über einzelne Anfragen hinaus zu interagieren. Obwohl der Ruf von Cookies unter der damit auf vielen Webseiten einhergehenden Bespitzelung von Nutzern gelitten hat, ermöglichen sie auch zusätzlichen Komfort. Sie speichern beispielsweise individuell bevorzugte Einstellungen und sind wichtiger Bestandteil zahlreicher Web-Anwendungen. Die »Session« -Klasse der Requests-Bibliothek organisiert solche Sitzungen.

Eine wichtige Aufgabe bei der Kommunikation zwischen Server und Client besteht darin, letzteren zu identifizieren und über mehrere Requests hinweg wiederzuerkennen. Für den ersten Schritt definiert man Authentifizierungsdaten mittels Benutzernamen und Passwort:

s = request.Session()
s.auth = ('admin', 'magazin')

Diese beiden Zeilen erzeugen ein »Session« -Objekt und legen die während dieser Sitzung verwendeten Zugangsdaten fest. Nun kann die Konktaktaufnahme erfolgen. Dafür stellt die Session-Klasse die bekannten Methoden ebenfalls bereit: »get()« , »post()« , »put()« , »delete()« , »head()« und »options()« . Sie funktionieren wie gehabt:

s.get(URL)

Bei diesem »GET« -Request kommen die im Session-Objekt gespeicherten Sitzungseinstellungen wie die Authentifizierungseinstellungen zum Tragen. Auch die Header-Felder lassen sich über das »headers« -Attribut für die gesamte Lebensdauer einer Sitzung setzen.

Auch die Session-Methoden »get()« , »post« und Co liefern Reponse-Objekte zurück, die genauso wie die Ergebnisse von »requests.get()« und »requests.post()« aussehen.

Das Session-Attribut »cookies« verändert sich gegebenenfalls selbst. Zunächst enthält es ein leeres »RequestsCookieJar« -Objekt. Eine in der Sitzung abgesetzte Anfrage wie »s.get(URL)« lagert erhaltene Cookies dort ein, sodass der Server sie beim nächsten Request auslesen kann.

Natürlich hat ein Programm zwischen zwei Anfragen die Möglichkeit, Cookies wie Header nach Belieben zu manipulieren. Das geschieht über die »Session« -Attribute »cookies« und »headers« .

Anfrageformular

Die Anfrage, die »get()« , »post()« und die anderen Request-Methoden verschicken, verwenden von der Requests-Bibliothek definierte Vorgaben. Beispielsweise steht das Header-Feld »User-Agent« auf »python-requests« , gefolgt von der Versionsnummer und dem Betriebssystem. Standardmäßig nimmt ein Request alle Dateitypen gleichermaßen als Antwort entgegen und kommuniziert dies über den Eintrag »*/*« im Header-Feld »Accept« . Der dritte, von Requests standardmäßig definierte Header heißt »Accept-Encoding« ; er steht auf »gzip, deflate, compress« .

Diese und andere Parameter lassen sich über Objekte der Klasse »Request« beliebig definieren. Dabei handelt es sich um die gleichen Objekte, die hinter den Kulissen auch die Methoden »get()« und »post()« verwenden und selbst mit Parametern ausstatten. Das Attribut »method« eines »Request« -Objekts etwa definiert die Art des HTTP-Requests, also »GET« , »POST« oder eine andere HTTP-Methode.

Im Rahmen einer Sitzung lassen sich eigene Requests definieren und einsetzen. Dazu erzeugt man zunächst ein Objekt dieser Klasse, etwa mit:

req = requests.Request('GET', 'http://www.admin-magazin.de')

Nun lässt sich das Request-Objekt nach Wunsch gestalten, beispielsweise mit neuen Header-Einträgen. Soll die Anfrage etwa HTML-Antworten bevorzugt entgegennehmen, setzt man das für diesen Zweck vorgesehene Header-Feld »Accept« entsprechend:

req.headers['Accept'] = 'text/html'

Gemäß der HTTP-Definition liefert der Server dann dieses Format aus, falls unter der angegebenen URL verschiedene Dateien zur Auswahl stehen. Die Adresse des anzusteuernden Servers enthält das Attribut »url« .

Zum Einsatz kommen selbst generierte Request-Objekte über die »send()« -Methode eines »Session« -Objekts. Sie erfordert allerdings eine Instanz der Klasse »PreparedRequest« . Der Aufruf der »Request« -Methode »prepare()« macht dieses versandfertig und verwandelt es in ein »PreparedRequest« -Objekt. Nun übergibt man es als Parameter an »send()« :

s = requests.Session()
...
req = requests.Request()
...
req.prepare()
s.send(req)
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