Sesjoner
>Eksempler
Sesjonshåndtering
Eksempel 1
Et enkelt eksempel som setter en cookie. Skrevet av Audun Våler
#! /usr/bin/python2.3 """ Demonstrerer hvordan en cookie enkelt kan sendes til browseren. """ import Cookie c = Cookie.SimpleCookie() # Et nytt sett cookies c["python"] = "2.2" # Ny cookie (navn: python, verdi: 2.2) c["python"]["max-age"] = 3600 # Browseren dropper cookien etter 1 time cookieText = c.output() # Cookie-settet konverteres til tekst print "Content-type: text/plain" print cookieText # Cookie-settet sendes til browseren print "" print "Hallo. Browseren din har mottatt en cookie."
Eksempel 2
Et eksempel som setter og leser cookies. Skrevet av Audun Våler
_au_viewer.py
#! /usr/bin/python2
# -*- coding: utf-8 -*-
"""
Dette skriptet demonstrerer lesing og setting av cookies,
og er dessuten praktisk for eksperimentering.
"""
import cgitb, cgi, Cookie, os
cgitb.enable()
def PrintHead(cookieText = ""):
"Skriver ut headere og begynnelsen p㟤okumentet"
# Sender eventuelle cookies til browseren
if cookieText:
print cookieText
print "Content-type: text/html; charset=utf-8\n"
print """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head><title>Cookie-manipulator</title></head>
<body>
<h1>Cookie-manipulator</h1>"""
def PrintTail():
print """
</body>
</html>
"""
def PrintNew():
"Lager panelet for innlegging av nye cookies"
print """ <hr />
<h2>Ny cookie</h2>
<p>
Her kan du lage en ny cookie (eller forandre en gammel).
Bare navn og verdi må fylles ut.
</p>
<form action="au_viewer.py" method="get">
<div style="width: 20em; text-align: right; margin: 2em;">
<p>
Name: <input type="text" name="name" />
</p>
<p>
Value: <input type="text" name="value" />
</p>
<p>
Path: <input type="text" name="path" />
</p>
<p>
Domain: <input type="text" name="domain" />
</p>
<input type="submit" value="OK" />
</div>
</form>"""
def PrintSent(cookieText):
"Skriver ut cookie-informasjonen som ble sendt til klienten"
print ' <hr />'
print ' <p>Denne cookie-informasjonen ble sendt til browseren:</p>'
print ' <pre>'
print cookieText
print ' </pre>'
def PrintReceived(cookieText):
"Skriver ut cookie-informasjonen som ble mottatt fra klienten"
print ' <hr />'
print ' <p>Denne cookie-informasjonen ble mottatt fra browseren:</p>'
print ' <pre>'
print cookieText
print ' </pre>'
def PrintCookies(cookies):
"""
Skriver ut cookies som ble mottatt fra klienten, pent formatert
i en tabell. Klienten vil bare sende cookies den regner som
gyldige for dette CGI-skriptet.
"""
print ' <hr />'
print ' <h2>Kjente, gyldige cookies</h2>'
print ' <p>'
print ' Dette er cookies som er satt slik at de er lesbare'
print ' for dette CGI-skriptet. (Cookies som nettopp er blitt'
print ' satt vil ikke dukke opp her første gang sida hentes.)'
print ' </p>'
print ' <table border="1">'
print ' <tr>'
print ' <th>Name</th>'
print ' <th>Value</th>'
print ' </tr>'
# Merk: En morsel er egentlig en cookie, jmf. kommentaren
# under.
for morsel in cookies.values():
print ' <tr>'
print ' <td>%s</td>' % morsel.key
print ' <td>%s</td>' % morsel.value
print ' </tr>'
print ' </table>'
if __name__ == "__main__":
form = cgi.FieldStorage()
# Vi sjekker om vi har mottatt input
if form.has_key("name") and form.has_key("value"):
cName = form["name"].value
cValue = form["value"].value
c = Cookie.SimpleCookie() # c er en samling av cookies...
c[cName] = cValue # ...med cName som navn og cValue som verdi.
m = c[cName] # m er en cookie (dvs. det Python kaller
# en morsel)
# path og domain legges til dersom vi mottok
# parametrene via CGI
try:
m["path"] = form["path"].value
except KeyError:
pass
try:
m["domain"] = form["domain"].value
except KeyError:
pass
# Cookiene konverteres til tekst som kan legges
# rett inn i HTTP-headeren
cookieText = c.output()
else:
# Hvis vi ikke mottok noe via CGI lar vi cookieText
# være tom (dvs. logisk false)
cookieText = ""
# cookies er her en samling av cookies
# (Pythons terminologi på mrådet er litt pussig).
cookies = Cookie.SimpleCookie()
try:
clientCookieText = os.environ["HTTP_COOKIE"]
except KeyError:
# Hvis vi ikke mottok noen cookie-informasjon
# lar vi clientCookieText være tom...
clientCookieText = ""
else:
# ...i motsatt fall parser vi informasjonen
# vi mottok
cookies.load(clientCookieText)
PrintHead(cookieText)
PrintNew()
PrintCookies(cookies)
if cookieText:
PrintSent(cookieText)
if clientCookieText:
PrintReceived(clientCookieText)
PrintTail()
Eksempel 3
En "simulering" av en nettbutikk. Skrevet av Audun Våler
_audundcookie3.py
#! /usr/bin/python
# -*- coding: iso-8859-1 -*-
"""
En meget enkel nettbutikk. Demonstrerer bruk av cookies for
sesjonsh?tering.
Hver bruker f?en sesjons-ID som knytter alle brukerens handlinger
sammen.
"""
# Varene i butikken. (I virkeligheten ville disse dataene ha ligget i
# en database.)
goods = {
305964: ("Canon Digital IXUS 30 (EU)", 2695),
303386: ("Canon Digital IXUS 30 3.2MP", 2795),
303218: ("Canon Digital IXUS 40 4.0MP", 3395),
123872: ("Canon Digital IXUS 500", 3795),
306907: ("Canon Digital IXUS i5", 3345),
302470: ("Canon PowerShot A400", 1495),
123869: ("Canon PowerShot A75", 2213),
306901: ("Canon PowerShot A85", 2495),
}
import cgi, cgitb, Cookie, os, random, tempfile
cgitb.enable()
# Katalog for lagring av sesjonsdata
sessionDataPath = tempfile.gettempdir()
# Skriver ut headerinformasjon (inkludert cookie)
# og begynnelsen p?# HTML-dokumentet.
def PrintHead(cookie):
# Cookie-informasjon skal bare skrives ut dersom funksjonen fikk
# en cookie som argument.
if cookie:
cookieText = "\n%s" % cookie.output()
else:
cookieText = ""
print """Content-type: text/html; charset=iso-8859-1%s
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Nettbutikk</title>
</head>
<body>
<h1>Nettbutikk</h1>
""" % cookieText
# Slutten p?okumentet.
def PrintTail():
print " </body>\n</html>"
# Skriver ut liste over tilgjengelige varer.
def PrintGoods():
print ' <h2>Vareutvalg</h2>'
print ' <table border="1">'
for gID in goods.keys():
print ' <tr>'
print ' <td>%06i</td>' % gID # Varenummer
print ' <td>%s</td>' % goods[gID][0] # Navn
print ' <td>%.2f</td>' % goods[gID][1] # Pris
print ' <td>'
# For hver vare lages det ?liten form. Varenummeret knyttes
# til klikket vha. et hidden-felt.
print ' <form action="shop.py" method="post">'
print ' <p><input type="hidden" name="buy" value="%i" />' % gID
print ' <input type="submit" value="Kj?></p></form>'
print ' </td>'
print ' </tr>'
print ' </table>'
# Skriver ut innholdet i handlekurven. Mottar liste av varenumre som
# argument.
def PrintCart(cart):
print ' <h2>Din handlekurv</h2>'
print ' <table border="1">'
# Lista sorteres slik at varer med samme varenummer kommer rett
# etter hverandre
cart.sort()
# Totalpris for alle varene i kurven
total = 0
# Denne tabellen er nesten helt lik den over
for gID in cart:
print ' <tr>'
print ' <td>%06i</td>' % gID
print ' <td>%s</td>' % goods[gID][0]
print ' <td>%.2f</td>' % goods[gID][1]
print ' <td>'
print ' <form action="shop.py" method="post">'
print ' <p><input type="hidden" name="remove" value="%i" />'% gID
print ' <input type="submit" value="Fjern" /></p></form>'
print ' </td>'
print ' </tr>'
total += goods[gID][1]
print ' <tr><td> </td><td><strong>Til sammen</strong></td>'
print ' <td>%.2f</td><td><p> </p></td></tr>' % total
print ' </table>'
# Returnerer gjeldende sesjons-ID ved ?ese cookie-data sendt fra
# browseren. Dersom ingen cookie ble mottatt (sannsynligvis fordi
# brukeren er i butikken for f? gang) eller innholdet er ugyldig
# returneres None.
def GetSessionID():
cookies = Cookie.SimpleCookie() # Tomt cookie-sett
try:
# Cookie-data mottatt fra browseren
clientCookieText = os.environ["HTTP_COOKIE"]
except KeyError:
return None
# Cookie-data parses
cookies.load(clientCookieText)
# Sesjons-ID fors?hentet ut
try:
sID = cookies["sessionID"].value
except KeyError:
return None
# Vi sjekker at sesjons-ID en gyldig (man kan aldri stole p?ata
# mottatt over nettet.)
if not len(sID) <= 9:
return None
# Ditto
try:
return int(sID)
except ValueError:
return None
# Lager en cookie som kan sendes til brukeren, enten basert p?n
# allerede eksisterende sesjons-ID eller med en helt ny ID for nye
# brukere.
def MakeSessionCookie(sID):
c = Cookie.SimpleCookie() # Tomt cookie-sett
# Hvis sID er None m?i lage en ny ID
if sID == None:
fNames = os.listdir(sessionDataPath)
while 1:
# ID-en er et stort, tilfeldig tall...
sID = random.randint(100000000, 999999999)
# ...som ikke kan finnes fra f? if sID not in fNames:
break
c["sessionID"] = str(sID) # Ny cookie...
c["sessionID"]["max-age"] = 1800 # ...med levetid p?0 minutter
# (1800 sekunder)
return c
# Returnerer liste av varenumre i handlekurven tilknyttet sesjons-ID
# sID. Returnerer tom liste hvis kurven er tom eller enn?kke finnes.
def GetCart(sID):
if sID == None:
return []
# Filsti til handlekurvfil
cartPath = os.path.join(sessionDataPath, str(sID))
try:
s = open(cartPath).read().strip()
except IOError:
# Fila kunne ikke leses, trolig fordi den ikke fantes.
# Vi returnerer derfor ei tom liste.
return []
if s:
# Splitter opp varenumre og konverterer hvert nummer til et
# heltall
gIDs = map(int, s.split(" "))
return gIDs
else:
# Handlekurven var tom
return []
# Lagrer handlekurven til fil. Varenumre skilles med space.
def SaveCart(sID, cart):
s = " ".join(map(str, cart))
savePath = os.path.join(sessionDataPath, str(sID))
open(savePath, "w").write(s)
# Legger vare til handlekurv (sID er sesjons-ID, cart er vareliste og
# gID er varenummer). Handlekurvdataene lagres deretter til fil
def AddToCart(sID, cart, gID):
if gID in goods.keys(): # Sjekker om varenummeret finnes
cart.append(gID)
SaveCart(sID, cart)
# Fjerner vare fra kurv. Argumentene er de samme som over.
def RemoveFromCart(sID, cart, gID):
try:
cart.remove(gID)
except ValueError:
pass # Varen fantes ikke i kurven
else:
SaveCart(sID, cart)
def Main():
form = cgi.FieldStorage()
sessionID = GetSessionID() # Henter sesjons-ID fra cookie
cookie = MakeSessionCookie(sessionID) # Lager ny cookie
cart = GetCart(sessionID) # Henter innholdet i handlekurven
# Hvis parametret buy er mottatt betyr det at brukeren har klikket
# p?n knapp for ?j?n vare. I s?all henter vi varenummeret
# (gID) og legger det til handlekurven.
try:
gID = int(form["buy"].value)
except KeyError:
pass
else:
AddToCart(sessionID, cart, gID)
# Se over
try:
gID = int(form["remove"].value)
except KeyError:
pass
else:
RemoveFromCart(sessionID, cart, gID)
PrintHead(cookie) # Headerinformasjon
PrintGoods() # Varebeholdning
if cart: # Handlekurv, dersom brukeren har noe i den
PrintCart(cart)
else:
print '<p>Handlekurven din er tom</p>'
PrintTail() # Slutten p?okumentet
if __name__ == "__main__":
Main()