Sessiot, evästeet, autentikointi ja tiedostot - Demo 4

Harjoitellaan sessioiden käyttöä WWW-sovelluksen tekemisessä. Toteutaan ensin sessioilla yksinkertainen lomake, joka laskee lukuja yhteen. Yritetään sen jälkeen toteuttaa vastaava lomake evästeiden avulla. Lisäksi toteutetaan lomake, jolla voi kirjoittaa rivin tekstitiedostoon tai tyhjentää tekstitiedoston. Lopuksi toteutetaan yksinkertainen lomake, jolla voi ladata tiedoston palvelimelle.

Laskuri sessioilla

Laskuri

Käytä apuna dokumenttia: mod_pythonin Session-luokka

  1. mod_pythonissa kannattaa sessioiden aktivointi tehdä omalla erillisellä käsittelijällä seuraavasti:
    • Kirjoita .htaccess-tiedostoon seuraavat rivit:
      PythonDebug On
      AddHandler mod_python .py
        
      PythonHandler sessions
      PythonHandler mod_python.publisher
    • Apache kutsuu määriteltyjä käsittelijöitä järjestyksessä. Kirjoita sessions.py-tiedostoon seuraavanlainen käsittelijä:
      from mod_python import apache, Session
      
      def handler(req):
              if not hasattr(req, 'session'):
                      req.session = Session.Session(req)
              return apache.OK

      Käsittelijä luo uuden istunnon (session) jos sellaista ei jo ole olemassa ja tallentaa istunnon req-objektiin. Jonossa seuraavana oleva käsittelijä kuljettaa valmiin session req-objektin mukana.

  2. Luo kuvan mukainen XHTML-sivu käyttäen mod_pythonin publisheria. Kirjoita siis .py-päätteinen tiedosto jossa on vähintään yksi funktio esim.
    def index(req):
    	return "Tähän koko sivun sisältö"
    
    • Tee body-osaan lomake, jonka action-attribuutissa on req.uri-muuttujan arvo eli mod_python-sovelluksesi osoite.
    • Lisää lomakkeelle tekstilaatikko, jonka otsikkona (label) on "Anna luku" ja name-ominaisuudessa luku.
    • Lisää lomakkeelle lisäksi submit-painike.
  3. Summan tuloksen säilyttämiseksi tarvitaan sessiomuuttujaa, joka säilyttää arvonsa koko istunnon ajan. Sessiomuuttujaa voi käyttää seuraavalla tavalla:
            try:
                    req.session['summa'] += 1
            except:
                    req.session['summa'] = 0
    
            req.session.save()

    Sessiomuuttujat toimivat tavallisen dict-taulukon tapaan.

    Ensimmäisellä käyttökerralla muuttujalla ei ole arvoa joten varminta on testata pythonin poikkeuskäsittelyn (try...except) avulla onko sessiomuuttujalla jo arvo vai ei. Jos muuttuja on alustamaton niin yritys lisätä muuttujan arvoa aiheuttaa poikkeuksen jolloin voidaan tehdä muuttujan alustaminen.

    Sessiomuuttujien sisältö ei jää automaattisesti talteen vaan aina täytyy muistaa sessiomuuttujien manipuloinnin jälkeen tallentaa sessio komennolla req.session.save()!

  4. Ota lomakkeelle annettu luku talteen. Tarkista, että lomakkeelle on varmasti syötetty kokonaisluku. Lisää luku haluamaasi sessiomuuttujaan. Tulosta yhteenlaskettu summa sivulle.
  5. Istunnon ja siihen liittyvien muuttujien ylläpitäminen edellyttää, että käytetty selain tukee evästeitä. Evästeessä kuljetetaan selaimen ja WWW-palvelimen välillä istuntoon liittyvää tunnistetta. Kokeile Web Developer Toolbarin avulla millaisen evästeen mod_python asettaa käyttäessäsi sessioita.

    Seuraavassa kuvassa hahmotetaan sessioon liittyvää toimintaa PHP-sovelluksessa. Toiminta on täysin vastaavaa mod_python-sovelluksilla.

    Sessiot ja client-server

    Testauksessa kannattaa käyttää myös Web Developer Toolbarista löytyvää valintaa Cookies | Clear Session Cookies. Näin pääset laskurin alkutilaan.

  6. Tee uusi sivu joka poistaa istuntosi session.invalidate()-metodilla. Kokeile nollautuuko laskuri.

Laskuri evästeillä

Edellisen esimerkin laskurin voisi periaatteessa tehdä evästeillä. Tällöin summaa olisi mahdollista tallentaa myös selaimen sulkemisen ajaksi. Muuta edellisen esimerkin laskuri toimimaan evästeillä sessioiden sijaan.

  1. Evästeen asettaminen:
    from mod_python import apache, Cookie
    keksi = Cookie.Cookie('nimi','arvo', expires=time.time()+24*60*60, path="/~tjlahton/", domain=".jyu.fi")
    Cookie.add_cookie(req, keksi)
    
    • Eväste on asetettava ennen varsinaista dokumenttia, koska se tulee HTTP-otsikkotietoihin.
    • Evästeen kestoksi tulee siis yksi päivä.
  2. Evästeen arvon käyttäminen:
    keksit = Cookie.get_cookies(req)
    arvo = keksit["nimi"].value
    
  3. Testaa laskurin toimintaa. Kokeile myös sulkea välillä selain ja palata sitten samalle sivulle.
    • Toiminnasta huomaa sen virheen, että summa päivittyy oikeaksi aina vasta seuraavalla sivun latauksella. Tämä johtuu siitä, että evästeen arvo on käytettävissä aina vasta seuraavalla sivun latauskerralla. Sessioissa taas arvoa voidaan käyttää heti sen asettamisen jälkeen.
    • Evästeet voi poistaa Web Developer Toolbarin toiminnolla Cookies | Delete Path Cookies.
  4. Muuta toiminta siten, että tuloksena näytetään evästeen arvon ja lomakkeelta lähetetyn arvon summa.

Evästeet ja client-server

Tiedostojen käsittely

Tiedostojen käsittely

Katso mallia Pythonin dokumentaatiosta: Reading and Writing Files.

Tehdään lomake, jolla voi kirjoittaa rivin tiedostoon tai tyhjentää tiedoston.

Tiedoston lataus palvelimelle

Tiedoston lataus

Tehdään yksinkertainen lomake, jolla voi ladata tiedoston palvelimelle.

Autentikointi

Käyttäjän kirjautuminen ja autentikointi järjestelmään tehdään seuraavalla tavalla:

  1. Lisää .htaccess-tiedostoon yksi käsittelijä sessiokäsittelijän ja varsinaisen käsittelijän väliin. esim:
    PythonHandler autentikointi
  2. Luo autentikointi.py johon kirjoitat käsittelijän:
    from mod_python import apache, Session
    from mod_python import util
    
    def handler(req):
            try:
                    if req.session["kirjautunut"] == "ok":
                            return apache.OK
            except:
                    form = util.FieldStorage(req)
                    tunnus = form.getfirst("tunnus")
                    salasana = form.getfirst("salasana")
                    if tunnus == "ope" and salasana == "ope":
                            req.session["kirjautunut"] = "ok"
                            return apache.OK
                    req.content_type = "text/html"
                    req.write( "Et ole kirjautunut. Tähän tulisi kirjautumiseen vaadittava lomake" )
                    return apache.DONE
    
    1. Käsittelijä tarkistaa löytyykö sessiomuuttujasta "kirjautunut" tieto siitä, että kirjautuminen on tehty. Jos löytyy niin palautetaan ok ja apache jatkaa käsittelyä seuraavalla käsittelijällä
    2. Jos kirjautumista ei ole tehty niin kokeillaan onko lomakkeelta tullut kirjautumiseen tarvittavat tiedot ja ovatko ne oikein. Jos ovat niin jatketaan normaalisti.
    3. Jos kirjautuminenkaan ei onnistu niin tulostetaan kirjautumiseen vaadittava lomake ja palautetaan apache.DONE, joka estää loppujen käsittelijöiden suorittamisen ja näkyville jää siis vain kirjautumislomake.
  3. Kirjoita kirjautumiseen vaadittava lomake ja kokeile kuinka kirjautuminen onnistuu
  4. Kirjoita uusi sivu jolla voi uloskirjautua eli sivu poistaa istunnon (session) tai asettaa uudelleen kirjautumisessa käytetytn sessiomuuttujan.

MD5

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/demot/demo4/
© Antti Ekonoja (antti.j.ekonoja@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2010-02-04 00:04:00
Informaatioteknologia - Jyväskylän yliopiston IT-tiedekunta ja avoin yliopisto