akadeemia.kakupesa.net
Download
Report
Transcript akadeemia.kakupesa.net
Veebitehnoloogiad IV:
Zope, Plone, Python
Kaido Kikkas
VR1 2009/2010
© 2009 Kaido Kikkas. Levitamine sätestatud vastavalt GNU Vaba Dokumentatsiooni Litsentsile (v l.2 või uuem)
või Creative Commons Attribution-ShareAlike (BY-SA) 3.0 litsentsile
Veebitegemise variante
Otse ja lihtsalt (X)HTML
(X)HTML + erinevad skriptikeeled
+ andmebaasid
+ sisuhaldussüsteem
Rakendusserver
Rakendusserver
Rakendusserver – vahelüli veebihalduri ja
erinevate teenuste (andmebaasid jms) vahel
Tööks vaja täiendavalt ainult „õhukest klienti“
(thin client) – veebilehitsejat. Kogu töö toimub
serveris
Ärivara: IBM WebSphere, Java System
Application Server, Oracle Application Server,
Borland Enterprise Server, Novell Extend
Vaba tarkvara: Red Hat JBoss, Zope, Midgard
Zope
Digital Creations, Jim Fulton 1996 => Principia
Algul kinnine kommertssüsteem. DC osanik
Hadar Pedhazur soovitab 1998. aastal lasta kood
vabaks ja muuta firma ärimudel teenusepakkujaks. Principia => Zope (Z Object Publishing
Environment)
Kiire levik (NASA, US Navy, paljud firmad)
Katsetamiseks sobib http://www.objectis.org!
Zope'i võimalused
Vaba lähtekood, Zope Public License (GPL-üh.)
Lihtne veebipõhine haldusliides (vaikimisi port
8080), lisaks ligipääs SSH ja FTP kaudu
Platvormid: ametlikult Linux, Solaris ja Win32,
töötab ka paljudel teistel (MacOS X, BSD,
BeOS, HP-UX)
Suur hulk eri tasemel lisamooduleid (produkte)
Iga asi on objekt (vrd. Unixi „iga asi on fail“) ühine suur objektibaas => kogu inf ühes suures
...
Oma meiliserver (Mailhost) ja veebiserver
(ZServer), lisaks ühilduvus Apache'i, IIS ja teiste
levinumate veebiserveritega
Toetab enamikku levinud andmebaasistandarditest (Oracle, MS SQL, MySQL, PostgreSQL jpt)
Üldjuhul lihtne paigaldada
Sisseehitatud kasutajahaldus ja turvamehhanism
Tagurdamisvõimalus (Undo)
Üldvaade
Produktid
Mõnel juhul lisafunktsioone pakkuvad moodulid,
enamasti aga täismahus rakendused, mis töötavad
Zope'i keskkonnas. vt. ka
http://www.zope.org/Products
Installiks piisab harilikult lahtipakkimisest Zope
kataloogi alamkataloogi lib/python/Products ning
Zope'i uuestikäivitamisest
Installitud produktid on saadaval Zope'i
haldusliidese menüüst
DTML
Document Template Markup Language
HTMLi sarnane ja paralleelselt kasutatav
märgendikeel
Peamine ülesanne: eri komponentide sidumine ja
korduvate elementide lühendamine
Lihtne näide: standard_html_header ja
standard_html_footer võimaldavad kogu
veebisaidil kasutada ühtset stiili
DTML näide
Standard_html_header:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="et" lang="et">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
<meta name="generator" content="ise tehtud Zope'i kaudu" />
<meta name="author" content="Kaido Kikkas" />
<meta name="classification" content="kodulehekülg" />
<meta name="description" content="Kaku Akadeemia õppematerjal" />
<meta name="keywords" content="Kakk, PHP, SQL, Zope" />
<title>Kaku Akadeemia</title>
<link rel="stylesheet" href="kakk.css" type="text/css" />
</head>
<body>
...
Standard_html_footer:
<p>© 2007 Kakk</p>
</body>
</html>
Nüüd saame mistahes lehe oma Zope'i veebisaidis luua kohe sellisena:
<dtml-var standard_html_header>
<h1>pealkiri</h1>
<p>Sisu</p>
...
<dtml-var standard_html_footer>
Sisuliselt kasutatakse siin samas rollis kui PHP include/require -lauseid
DTMLi infoallikad
Lisaks võib DTML-märgendites kasutada infot,
mis pärineb
teistest Zope'i objektidest
välistest allikatest (andmebaasid jms)
kasutaja veebilehitsejast (cookied, veebipäised)
Sageli kasutatakse Pythoni koodi lisamist (exprklausliga)
Märkus – DTML kasutab nii paaris- kui
üksikmärgendeid (nagu HTML, kuid mitte
XHTML)
PHP-st tuttav näide:
<dtml-if expr="sugu == 'naine' ">
See on naiste lehekülg!
<dtml-else>
See on meeste lehekülg!
</dtml-if>
NB! Lubatud on ka lühikuju – expr-lause
ärajätmine ja lihtsalt jutumärkide kasutamine:
<dtml-if "sugu == 'naine'">
Veel üks näide
Teeme meilisaatmisvormi (mingi teenusega liitumise registreerimiseks),
kasutades Zope'i enda Mailhosti. Esmalt veebivorm:
<dtml-var standard_html_header>
<form action="meilimootor" method="post">
<p>Eesnimi: <input type="text" name="eesnimi" size="30"></p>
<p>Perenimi: <input type="text" name="perenimi" size="30"></p>
<p>Aadress: <input type="text" name="aadress" size="50"></p>
<p>Telefon: <input type="text" name="telefon" size="20"></p>
<p>E-post: <input type="text" name="epost" size="30"></p>
<p><input type="submit" value="Saada"></p>
</form>
<standard_html_footer>
NB! Kasutame eespool nähtud päise- ja jalusefaile!
Meilimootor
<standard_html_header>
<dtml-sendmail mailhost="MeieMeiliMasin">
To: [email protected]
From. <dtml-var epost>
Subject: Tahan registreeruda
Soovin registreeruda Teie teenuse kasutajaks.
Nimi: <dtml-var eesnimi> <dtml-var perenimi>
Aadress: <dtml-var aadress>
Telefon: <dtml-var telefon>
E-post: <dtml-var epost>
</dtml-sendmail>
<h1>Aitäh, <dtml-var eesnimi>!</h1>
<p>Teie soov on haldurile edastatud.</p>
<dtml-var standard_html_footer>
DTML ja TAL
DTMLi puudused Zope Bible'i järgi:
Ei saa hästi redigeerida väliste veebieditoridega
Ei saa redigeerida WYSIWYG-editoridega
Kiputakse segama kokku programmiloogikat ja esitust
Ise lisaksin veel – kohati paindumatu oma HTMLi
genereerimisel – tulemuseks on ebastandardne ja
ligipääsmatu veebileht
Uus suund alates Zope 2.5-st – kasutatakse lehemalle (Page Templates) ja vastavat XML/XHTMLpõhist keelt TAL (Template Attribute Language) ja
TAL
Põhimõte – luuakse lehekülje mall (n.ö. skelett),
mille väljadesse saab sisu kirjutada dünaamiliselt
(sellisena sarnaneb mõneti HTML/PHP tehnikale)
XMLi süntaksiga argumendid, mida saab lisada
tavalistesse XHTML-märgenditesse:
N:<p tal:content="user/getUserName">Kai</p>
Hetkel pikemalt ei käsitle. vt Zope Bookist:
http://www.zope.org/Documentation/Books
/ZopeBook/
2,3,5
Zope 2.x – laialt kasutatav seeria, aga rida
puudusi
Zope 3.x – alates novembrist 2004, paralleelselt
eelmise seeriaga
3 on laiaulatuslik uuestikirjutus, ei ühildu 2-ga –
2 viimaseid versioone arendatakse 3 suunas
Five – 2. seeria laiendus, mis lubab kasutada osa
3. seeria funktsioonidest
Zope'i paigaldamine
Pakkida lahti
Käivitada install
NB! Uuemate Zope'i versioonide paigaldus on
kaheosaline – esmalt paigaldatakse põhiosa,
seejärel luuakse nn instants ehk konkreetne
Zope'i realisatsioon – see võimaldab ühel serveril
käitada mitu erinevat Zope'i
Linuxitel paigaldatakse põhiosa, instants tuleb
ikkagi ise luua. Vt dokumentatsiooni
Plone
Zope'il baseeruv sisuhaldussüsteem, üks enim
kasutatavaid Zope'i mooduleid
Loodi 1999 3 programmeerija poolt, alates 2004.
aastast juhib arendamist Plone Foundation
Nimi pandud samanimelise 90-ndatel Inglismaal
tegutsenud tehnobändi järgi
Tänaseks üks kiirema levikuga
sisuhaldussüsteeme
Omadusi
Standardne, multiplatvormiline, palju tõlkeid
Lihtsa portaalitooriku ülesseadmine on äärmiselt
lihtne
Sisuga töötamine on lihtne
Zope'i turvamehhanism => lihtne anda eri
autoritele erinevaid õigusi
Vahetatavad kujundused (nn. nahad)
Zope'i „pikendus“ (produkt) – saab hallata nii
omaette kui läbi Zope'i
Python
Guido van Rossumi poolt 1991. aasta paiku loodud
skriptikeel (tänaseks üldotstarbeline keel)
versioon 2 aastast 2000, a-st 2008 paralleelselt v3
Interpreteeriv keel (nagu standard-BASIC), olemas
vahekoodikompilaator
OO-keel
Lai platvormivalik MSDOSist Maci ja Linuxini
Sobib algajatele lihtsa ja selge süntaksi poolest
Kus kasutatakse
Veebi-skriptikeel (algne kasutus; ~ PHP) –
YouTube, Google, Yahoo!...
Rakendusserverid (Zope, Django)
Erinev graafikatarkvara – GIMP, PaintShop Pro,
Inkscape, Maya, Blender...
Sugar (OLPC XO)
Linuxi paigaldustarkvara (Ubuntu, Red Hat jpt)
„Hello World“
Väga lihtne:
>>> print "Tere-tere, maakera!"
Siin >>> tähistab Pythoni käsurida
Lause lõpetab reavahetus (v.a. erijuhud), eraldi
lõpusümbolit (nagu C-s jm. semikoolon) ei ole.
Ka veerupositsioon on oluline (sellest hiljem)!
Veel üks lihtne näide koos sisestusega:
nimi = raw_input("Mis su nimi on? ")
print "Tere, ", nimi
Muutujanimed on ilma tüübitunnuseta
Loogika ja andmetüübid
Üldiselt tavapärane, mittevõrdus nii != kui <>,
võrdus == (= on omistus)
Arvutüübid:
Täisarv - 0, -1, 10
pikk täisarv - 40405005292949559595L (L tähistab pikka
väärtust)
reaalarv - 2.4, 1.0, 3.45e-10, 5E210, 4.2e+212
Kaheksandarv – 062
kuueteistkümnendarv – 0xff, 0x1A
kompleksarv – 24+10j, 4j
Tekstitüüp
Sarnased põhimõtted teiste keeltega. Nagu PHP-s
kasutatakse teksti sees jutumärkide või ülakoma
esitamiseks kurakaldkriipsu:
tekst = "Vanaema ostis \"Philipsi\" tolmuimeja"
Teksti võib vaadelda ka massiivina:
>>> tekst = "Sokid ja saapad"
>>> tekst[6]
'j'
>>>
Paneme tähele, et massiivi järjestust loetakse ka
siin 0-st (väljastati teksti 7. täht)!
...
Tekst mitmel real – kaht moodi
>>> print "See on siin üks \
jube pikk lause!"
Parem: kolmekordsed jutumärgid/ülakomad:
>>> pikklause = """Kogu see pikk jutt siin,
tuleb ekraanile täpselt nii,
nagu ma ta siia kirjutan – umbes
nagu HTMLis <pre>-märgendite abil.
NB! Isegi jutumärke ei ole vaja paosümbolitega
varustada! N: Papa "Lada" pani puusse. """
...
Tekstijuppide liitmine käib +-märgiga. Kui tahta
teksti sisse panna arvväärtusi, tuleb see esmalt
str-funktsiooniga tekstiks teha:
>>> print "Onu Jüri ostis " + str(5) + " õlut."
Massiivid
Kaks tüüpi. Tavamassiivi moodi on rohkem list
Listitüüp võib sisaldada eri tüüpi elemente, lisaks
on eraldi funktsioonid nagu append, insert ja del
elementidega opereerimiseks
Saab määrata ka listilõikeid ehk väljavõtteid
(slice)
List: näide
>>> yks_list = [1,2,3]
>>> yks_list
[1, 2, 3]
>>> yks_list.append("joru")
>>> yks_list
[1, 2, 3, 'joru']
>>> yks_list.insert(1,"toru")
>>> yks_list
[1, 'toru', 2, 3, 'joru']
>>> del yks_list[1]
>>> yks_list
[1, 2, 3, 'joru']
>>> yks_list[2]
3
>>> yks_list[2:]
[3, 'joru']
>>> yks_list[:2]
[1, 2]
>>>
Ennik
Et misasja...?
Eestikeelne uudisvaste ingliskeelsele sõnale tuple
Pythoni kontekstis võiks mõista kui massiivi- või
kirjetüüpi konstanti – peale defineerimist enam
muuta ei saa:
>>> yks_ennik = (1,2,3,4,5)
>>> yks_ennik
(1, 2, 3, 4, 5)
>>>
Sõnastik
võtme ja väärtuse paaridest moodustatud
massiivisarnane tüüp:
>>> isik = {'nimi': 'Jyri', 'vanus': 23, 'pikkus': 182, 'jalanumber':
43}
>>> print isik
{'nimi': 'Jyri', 'jalanumber': 43, 'vanus': 23, 'pikkus': 182}
>>> print isik['nimi']
Jyri
>>>
...
Väärtuse muutmiseks tuleb talle lihtsalt anda uus
väärtus, uue võtme lisamiseks tuleb defineerida
uus võtme-väärtuse paar:
>>> isik['jalanumber'] = 45
>>> print isik
{'nimi': 'Jyri', 'jalanumber': 45, 'vanus': 23, 'pikkus': 182}
>>> isik['kaal'] = 86
>>> print isik
{'kaal': 86, 'nimi': 'Jyri', 'jalanumber': 45, 'vanus': 23, 'pikkus':
182}
>>>
...
Sõnastikust eemaldamine käib nagu listiski delfunktsiooniga. Lisaks saab kasutada ka
tühjendusfunktsiooni clear, mis kogu sõnastiku
tühjendab:
>>> print isik
{'kaal': 86, 'nimi': 'Jyri', 'jalanumber': 45, 'vanus': 23, 'pikkus':
182}
>>> del isik['kaal']
>>> print isik
{'nimi': 'Jyri', 'jalanumber': 45, 'vanus': 23, 'pikkus': 182}
>>> isik.clear()
>>> print isik
{}
>>>
Valik
Tavaline IF:
soov = "Elevant"
pakkumine = raw_input ("Mis looma sa müüd? ")
if pakkumine == soov:
print "Jaa, selle ostan kohe ära!"
else:
print "Päh, seda küll ei taha!"
paar olulist punkti:
a) nagu juba mainitud – programmiplokke tähistatakse
treppimise ehk nihke abil
b) tervikut moodustavate juhtlausete (if ... else) järel on
koolon
...
Case/switch -mitmendvalik Pythonis puudub,
küll aga saab kasutada PHP-ski nähtud elseif-osa
(Pythonis kujul elif):
soov = "Elevant"
pakkumine = raw_input ("Mis looma sa müüd? ")
if pakkumine == soov:
print "Jaa, selle ostan kohe ära!"
elif pakkumine == "Skunks":
print "Wäääkkk!! Korista end siit koos tolle haisukotiga!"
else:
print "Päh, seda küll ei taha!“
Kordus
Pythonis on olemas eelkontrolliga kordus (while)
ja fikseeritud kordus (for) – puudub do-while
tüüpi järelkontrolliga kordusetüüp
Ka korduse juures antakse tsükliskoopi edasi
treppimisega:
print "Loeme numbreid:"
while i<=5:
print i
i=i+1
print "Ongi loetud!"
...
Huvitaval kombel kasutatakse Pythonis whiletsüklis ka else-klauslit – see täidetakse viimase
lausena enne tsükli töö lõppu:
print "Loeme numbreid:"
while i<=5:
print i
i=i++
else:
print "Ongi loetud!"
...
For-tsükkel on mõnevõrra teistsugune kui mujal,
nimelt kasutatakse seda siin pigem massiivi
läbimiseks (PHP foreach):
loomad = ['koer', 'kass', 'rott', 'jõehobu']
for loom in loomad:
print loom
else:
print "Loomi polegi!"
Tsüklist väljumiseks ja uue kordustakti
alustamiseks on nagu PHP-s break ja continue,
mida kasutatakse samamoodi
Lõpetuseks
Eelnev oli nii Zope'i kui Pythoni väga
pinnapealne tutvustus
Ka Zope ja Python oleks üks võimalus oma
ainesisese rakenduse loomiseks!
Proovige Zope'i http://www.objectis.org või
installige oma masinasse. Kõige lihtsam on seda
teha Linuxis – Ubuntul on Python 2.7 kaasas ja
Zope 2.10, 2.11 ja 3 paigaldatavad otse
varamutest (N: sudo apt-get install zope3)
Tänaseks kõik...