Kapitel 22
CGI-Programmierung
618
Erläuterung:
#1: Der Debugging-Mechanismus für CGI-Skripte aus dem Modul cgitb wird aktiviert.
#2: Falls die Datei mit dem Dialog existiert, wird sie geöffnet ...
#3: ... oder ansonsten eine neue Datei angelegt.
#4: Wenn der bisherige Dialog mehr als zehn Zeilen umfasst, wird er auf die letzten zehn
Zeilen gekürzt.
#5: An die Liste mit den Dialogzeilen wird die neue Zeile (bestehend aus Name und Beitrag)
angehängt und anschließend alle Dialogzeilen der Liste in der Datei abgespeichert.
#6: Die globale Variable PFAD enthält den relativen Pfad zu einer Textdatei, in der der Dialog
gespeichert wird. Achtung! Bezugspunkt für den relativen Pfad ist das Verzeichnis, in dem
das Serverskript
httpd.py gespeichert ist.
#7: Aus der FieldStorage-Instanz namens form werden die Werte der Variablen herausge-
lesen.
#8: Falls die Variable beitrag einen Text enthält, wird der Dialog aktualisiert.
#9: Hier wird der Text des HTTP-Pakets berechnet, das an den Client zurückgeschickt wer-
den soll. Die Schablone enthält variable Teile (Dialog und Name des Teilnehmers), die durch
Platzhalter
{} gekennzeichnet sind. Diese werden mithilfe der String-Methode format()
durch Texte ersetzt (siehe Abschnitt 13.3.1).
22.8 CGI-Skripte mit Cookies
Cookies (»Kekse«) sind kleine Texte, die bei einer Kommunikation über das HTTP-Protokoll
von einem Server im Header eines HTTP-Pakets gesendet und in einem besonderen Ver-
zeichnis des Clients abgespeichert werden. Sie enthalten meist Informationen über frühere
Besuche einer Website. Cookies können ein Verfallsdatum besitzen. Ist dieses überschrit-
ten, wird das Cookie gelöscht. Fehlt das Verfallsdatum, so wird das Cookie beim Client nicht
dauerhaft gespeichert, sondern ist nur während der Sitzung gültig. Das heißt, wenn Sie das
Browserfenster schließen, geht auch das Cookie verloren. In diesem Kapitel beschreibe ich
nur solche »flüchtigen« Cookies.
Das Python-Modul
Cookie enthält die Definitionen mehrerer verschiedener Cookie-Klas-
sen. Es wird empfohlen, (aus Sicherheitsgründen) nur die Klasse
SimpleCookie zu verwen-
den. In folgenden Python-Anweisungen wird ein Objekt dieser Klasse instanziiert:
Cookie-Objekte werden wie Dictionaries behandelt. In folgenden Anweisungen erhält das
SimpleCookie-Objekt c einige Dateneinträge:
Im
SimpleCookie-Objekt werden nur Strings gespeichert. Andere Datentypen werden bei
Zuweisungen der obigen Form in Strings umgewandelt.
>>> import http.cookies
>>> c = http.cookies.SimpleCookie()
>>> c['Alter'] = 21
>>> c['Name'] = 'Katja'
619
22.8
CGI-Skripte mit Cookies
Die textuelle (druckbare) Repräsentation eines Cookie-Objektes, die mit der str()-Funktion
oder einer
print()-Funktion ausgegeben wird, ist ein String. Er enthält die Kommandos
zum Setzen von Cookie-Werten gemäß dem HTTP-Protokoll, die in den Header eines
HTTP-Pakets geschrieben werden.
Die Werte der einzelnen Cookie-Variablen können über das Attribut
value abgefragt werden:
Sie erkennen, dass die Variablenwerte des
SimpleCookie-Objektes immer vom Typ String
sind.
Mit der
load()-Methode kann ein Cookie-Objekt mit Inhalt gefüllt werden. In einem CGI-
Skript verwendet man die
load()-Methode, um ein Cookie aus dem Speicher des Clients zu
laden. Das Cookie ist in der Umgebungsvariablen
HTTP_COOKIE gespeichert (siehe
Abschnitt 14.2.6) und kann deshalb mit folgender Anweisung gelesen werden:
Das folgende CGI-Skript gibt im Browserfenster aus, zum wievielten Mal es in der jeweili-
gen Sitzung aufgerufen worden ist (siehe Abbildung 22.11).
Abb. 22.12: Antwort des CGI-Skripts beim ersten und zweiten Aufruf
>>> print(c)
Set-Cookie: Alter=21
Set-Cookie: Name=Katja
>>> c['Alter'].value
'21'
>>> c['Name'].value
'Katja'
c.load(os.environ['HTTP_COOKIE'])
Kapitel 22
CGI-Programmierung
620
Skript:
Erläuterung:
Zu Beginn des Skripts werden einige Stringkonstanten mit langen Strings (drei Anfüh-
rungszeichen) definiert. Auf diese Weise wird das Layout des Python-Skripts übersichtli-
cher. Denn die Zeilen innerhalb eines langen Strings sollten nicht eingerückt werden, da die
führenden Leerzeichen mit zum String gehören.
import os
from http.cookies import SimpleCookie
# Stringkonstanten
antwort1 = """<h3> Willkommen!</h3>
Sie besuchen diese Seite zum ersten Mal."""
antwort2 = """<h3> Sch&ouml;n, dass Sie wieder hier sind!</h3>
Sie besuchen zum {}. Mal diese Seite."""
httpPaket = """Content-Type: text/html
{}
<html>
<head><title>Z&auml;hler</title></head>
<body>
{}
</body>
</html>""" #1
class Zaehler(object):
def __init__(self):
self.c = SimpleCookie() #2
try:
self.c.load(os.environ["HTTP_COOKIE"]) #3
self.c["zaehler"] = int(self.c["zaehler"].value)+1
except:
self.c["zaehler"] = 1 #4
self.besuche=self.c["zaehler"].value
def __str__(self):
if self.besuche == '1': antwort = antwort1 #5
else: antwort = antwort2.format(self.besuche) #6
return httpPaket.format(self.c, antwort) #7
print(Zaehler())

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.