!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

Sesjoner
Cookie
Python
Børre Stenseth
Sesjoner >Eksempler

Sesjonshåndtering

Hva
Et par eksempler på Pythonkode som administrerer cookies

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()
Du kan teste her http://www.it.hiof.no/~borres/cgi-bin/cookies/au_viewer.py

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>&nbsp;</td><td><strong>Til sammen</strong></td>'
    print '      <td>%.2f</td><td><p>&nbsp;</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()
Referanser

Koden er referert i teksten

Vedlikehold
Audun Våler, 2004
Moderert november 2009, Børre Stenseth
( Velkommen ) Sesjoner >Eksempler ( Eksempler )