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>&copy; 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...