Itv0030 2008 teise praksi tehniline juhend
Teise kodutöö praktiline juhend
NB! Kõik siintoodud laborifailid leiate aadressilt: http://dijkstra.cs.ttu.ee/~t001161/lab2.tar.gz
Sisukord
Dijkstra server
Kodutööde tarbeks on kasutusel server nimega dijkstra (see keeruline nimi on ühe tuntud arvutiteaduse teerajaja nimi ja keeruline seepärast, et see nimi teile paremini meelde jääks).
Ligipääs
Dijkstrasse sisselogimiseks on vaja end registreerida. Registreerimiseks piisas, kui esitasite oma esimese kodutöö õigeaegselt. Juhul kui te seda ei teinud, saatke kiri praktikumitunni juhendajale ja saate samuti ligi.
Sisselogimine
Sisselogimiseks kasutatakse SSL ühendust ehk siis maakeeli programmi putty (Windows) või ssh (Linux). Tegemist on siis käsurealigipääsuga Linuxipõhisele serverile.
- Teie kasutajanimi ja parool: TTÜ arvutiklasside kasutaja + parool
- Dijkstra aadress: dijkstra.cs.ttu.ee
Failide laadimine
Failide laadimiseks sinna kasutage SFTP protokolli. Üks võimalikest programmidest, mis seda toetab on näiteks Filezilla.
Keskkonna ettevalmistamine
Kõik asjad, mis paigutate oma dijkstra kodukataloogi alamkataloogi "public_html", on veebis nähtavad. See kataloog tuleb kõigepealt luua:
$mkdir public_html
("$" rea alguses tähistab nüüd ja edaspidi Linuxi käsurealt antavaid käske (enamus praeguse näite failioperatsioonidest peaks olema tehtavad ka SFTP graafilise liidese alt). Linuxi käsurea kasutamist tuleb uurida omal käel. Käsurea saamiseks tuleks üle SSH ühenduse dijkstra käsureale logida (ssh või putty vms) )
Kui kataloog on olemas, suunake oma brauser dijkstra aadressile, mille saate kui serveri lisate tudengikoodi serveri nimele (näiteks sedasi, aga asendage oma tudengikood ära): http://dijkstra.cs.ttu.ee/~t0XXX/
Kui kõik töötab õigesti, peaksite nägema kataloogi nimistut, mis on tühi, sest te pole sinna faile pannud. Tekitage index.html nimeline fail ja kontrollige, et see hakkab endist tühja kataloogilistingut asendama. Rakenduse html-failid võite panna sinnasamasse public_html alla.
Failiõiguste probleemid
Juhul, kui te kataloogi või oma index.html sisu ei näe, kontrollige, et nii teie kodukataloog kui public_html kuuluksid grupile "tudengid" ja et sellel grupil oleks nii lugemis-kui kataloogisisu vaatamise pääsuõigused. Samuti peab tudengigrupil olema võimalus lugeda kõiki veebi ülesminevaid faile.
Kataloogile lugemis-ja nimekirjanäitamise õiguse andmine:
$chmod g+rx public_html
Failile lugemisõiguse andmine:
$chmod g+r index.html
Nüüd, kus on kontrollitud, et veebis on staatilised HTML leheküljed üleval, saame põnevasse dünaamilisuse maailma sukelduda.
Põnev dünaamiline maailm
Praktikumi jaoks kasutate CGI skripti, mida saate enda rakenduse jaoks kohandada (aga ei pea tingimata). CGI skript on kirjutatud keeles Python ning kasutab SQLite nimelist SQL rakendust.
CGI rakendused elavad public_html alamkataloogis cgi-bin. (CGI rakendusi hoitakse traditsioonilselt staatilistest lehtedest eraldi, sest tegemist on ikkagi päris serveris käivituvate programmidega ja neil on sellest tulenevalt ka kõrgem turvarisk.)
$mkdir cgi-bin
Esmatutvus Pythoniga CGI kontekstis
Looge cgi-kataloogi järgmise sisuga fail "test.py":
#!/usr/bin/python print "Content-type: text/html" print print "<html><head><title>test.py</title></head><body><h1>Hello, World!</h1></body>"
Esimene, trelliga rida ütleb, et käivitate pythoni interpretaatori ja ülejäänud read trükivad välja HTMLi vastuse. Content-type ja reavahetus on sealjuures väga kriitilised saata.
Proovige brauseris selle faili aadress avada ja jälgige mis juhtub.
http://dijkstra.cs.ttu.ee/~tXXX/cgi-bin/test.py
Saate räige veateate, sest CGI skript ei ole käivitatav grupi õigustes (ega niisama).
Parandage failiõigused:
$chmod ug+x test.py
Proovige CGI skripti uuesti käivitada ja veenduge, et kõik töötab. Ka siin on oluline jälgida, et tudengite gruppi kuulujatel saaks antud faili nii lugeda kui kirjutada (st arvestage ka kataloogide pääsuõigustega).
Python + CGI
Selleks, et asju dünaamilisemaks teha, saate pythoni abil vastu võtta ka vormide infot. Selleks on tore imporditav moodul nimega cgi, mille funktsioonid aitavad vormiinfot söödavamal kujul sisse võtta.
Looge fail test2.py:
#!/usr/bin/python import cgi print "Content-type: text/html" print print "<html><head><title>test2.py</title></head><body><h1>Hello, World!</h1><p>Lisaparameeter oli " formdata = cgi.FieldStorage() if formdata.has_key("lisaparameeter"): print formdata['lisaparameeter'].value else: print "puudu" print ".</p></body>"
Vaadake faili brauseris:
http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/test2.py
Parandage faili õigused omaette kirudes, et seda unustati teile teisel korral öelda ja vaadake uuesti.
http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/test2.py http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/test2.py?lisaparameeter=olemas
See on siis selleks, et saaksite aru, et mis toimub. Jätame Pythoni mõneks ajaks rahule.
Esmatutvus SQLite programmiga
SQLite on tore väike programm, mida saab kasutada failipõhiste andmebaaside loomiseks ja mis on üsna populaarne. Kasutavad seda päris mitmed rakendused nagu näiteks Skype või Firefox 3 bookmarkide jaoks.
Olemuselt on kõik hästi lihtne: tuleb käivitada sqlite programm koos argumendiga, milleks on andmebaas.
Testandmebaas
$sqlite3 test.db
Teeme lihtsa tabeli, lisame sinna andmed, näitame välja:
sqlite> create table test(id integer primary key, data varchar(10)); sqlite> insert into test(data) values ('karu'); sqlite> select * from test; 1|karu
Väljumiseks vajutage CTRL+D.
Avastage, et teie programmikataloogi tekkis fail "test.db". Avage andmebaas uuesti ja veenduge, et karu on ikka veel baasis. Võite testandmebaasi kustutada.
Tegeliku andmebaasi tegemine
Praktikumide näitefailide all on schema.sql, pange see cgi-bin kataloogi ning looge uus andmebaas:
$sqlite3 data.db < schema.sql
See tekitab andmebaasi data.db ning suunab sinna schema.sql faili read, mis ükshaaval käivituvad ning seeläbi andmebaasiskeemi loovad. Tutvuge ka schema.sql sisuga.
Kuna schema.sql on hästi universaalne (sobib mõlemale ülesandele), võite üleliigsed skeemid kustutada ning ja skeemi enda äranägemise järgi kohendada. Samas ärge unustage, et see tähendab, et peate kohendama ka ülejäänud .py faile, mis võivad skeemidelt üht-teist eeldada.
Andmete lisamiseks sqlite3 abil tehke nagu varem:
$sqlite3 data.db sqlite>insert into inimesed(salvestaja, eesnimi, perenimi) values ('i@e.ee', 'Riho', 'Votolovootolovolovo'); sqlite>select * from inimesed;
Python + CGI + SQLite
Kui eelnevad näited töötasid puhtalt SQLite'i kasutades, vaatame nüüd kuidas kogu eelnev koos töötama hakkaks.
Teile on näitefailides antud kaks faili: otsi.py, mis vaikimisi näitab nõutud andmebaaside sisu ja salvesta.py, mis võimaldab vormiparameetreid andmebaasi salvestada.
otsi.py
Fail "otsi.py" otsib etteantud parameetritele vastavaid väljasid ja väljastab neid kas xml või json formaadis, sorteerib ning võimaldab päringutulemuste piiramist.
Lihtsaim päring on parameetriteta päring, mis tagastab kõik mingi konkreetse tabeli väljad. (Vaikimisi tabel on "inimesed").
Mõne andmebaasivälja sisu järgi otsimine: http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/otsi.py?eesnimi=Riho
Otsingu sorteerimine: http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/otsi.py?eesnimi=Riho&direction=asc
XML formaat: http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/otsi.py?format=xml
salvesta.py
Salvesta.py salvestab määratud tabelisse andmeid. Ette tuleb anda kõik kohustuslikud väljad. Välja "id" määramine pole vajalik. Eduka salvestamise puhul tagastub 1, ebaeduka salvestamise või andmebaasivea korral 0.
NB! Tähtis! Kui soovite üle CGI skripti faili muuta peab lisaks lugemisõigusele andma ka kirjutusõiguse. Kirjutamisõigus peab olema nii andmebaasifaili kui ka cgi-bin kataloogil.
$chmod g+w data.db $chmod g+w .