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()