Seznámení s jazykem Python a aplikačním serverem Zope
Autor: Vláďa Macek, http://macek.sandbox.cz
červenec 2003, verze 1
únor 2004, verze 1.1 (opravy překlepů, později jen opraven kontakt)
Dokument vznikl za finanční podpory společnosti Hieronymus, s.r.o.
Licence: Toto dílo se tímto stává veřejným vlastnictvím (Public
Domain). Autor se navždy vzdává výhradních práv
k nakládání s tímto dílem. Pokud následující informace využijete,
zmínka
o tom samozřejmě potěší.
Obsah
Úvod
-
Zope (Z Object Publishing
Environment) je aplikační server zaměřený na publikaci
dynamických dat. Jeho základem je soustava předdefinovaných i
uživatelských objektů, které se mohou vzájemně obsahovat (a tvořit tím
hierarchii) a využívají své schopnosti.
-
Aplikace v Zope se tvoří objektovým způsobem s vydatnou
pomocí
stále oblíbenějšího objektového jazyka Python.
Objektově orientované
programování
-
V zásadě proces rozlámání
libovolně
složitého problému do malých kusů, které se lépe spravují. Razí
princip, že tyto kusy by měly pracovat tak nezávisle, jak jen to jde a
komunikovat spolu pomocí daných rozhraní (API).
-
Na počátku stojí myšlenka
spojit
data a kód, který s nimi pracuje, dohromady. Tento celek tvoří tzv. objekt.
Data objektu (jeho vlastní proměnné) se nazývají atributy (v
Zope pak také vlastnosti -- properties) a s nimi
prováděné operace metody.
-
Přistupujeme-li k objektu
pouze
pomocí jeho API, je pro nás tento objekt černou skříňkou a nezajímá
nás ani to, zda na něm programátor stále pracuje a mění jeho
implementaci. Program se tím stává vysoce modulární.
-
Třída je
abstraktní popis objektu. Definuje, co by mohl dělat, kdyby
ožil. Takové oživení třídy objektu se nazývá instance. Třídu si
lze představit jako podrobný plán ke stavbě domu a instanci jako dům
již stojící. Podle jediného plánu lze postavit nekonečně mnoho domů,
které budou mít všechny zcela stejné atributy, ale na sobě budou
nezávislé a budou různě využívané.
-
Často definujeme potomky
již
existujících tříd, využíváme tedy mechanismu
dědičnosti. Máme-li např. další plán na stavbu přístěnku s
poznámkou, že veškerá dokumentace k domu se nachází v původním plánu,
vytvořili jsme odvozenou třídu. Tu však lze použít jako
kompletní návod na stavbu domu s přístěnkem, tedy k vytvoření
plnohodnotné instance.
-
V praxi se programuje tak, že
nadřazená třída (superclass) zobecňuje a sdružuje co nejvíce
funkčnosti tříd, které z ní budou odvozeny. Ty pak konkretizují své
vlastnosti.
-
Skutečnost, že každá většina funkcionality tak zůstává
definována a vylepšována pouze na jednom místě, poskytuje obdivuhodné
možnosti opětovného využívání již hotové práce. Díky dělení problému
do funkčních a pojmenovaných celků se celý projekt i lépe udržuje
a rozšiřuje.
Python
-
Interpretovaný jazyk s velice
jednoduchou a intuitivní syntaxí.
-
Syntaktická zvláštnost:
Vnořené
bloky a definice se vymezují větším odsazením od levého okraje a nikoli
speciálními tokeny (v C { } , v Pascalu begin
a end ). To vyžaduje jistý zvyk a přijetí, ale šetří psaní
a vynucuje přehlednější kód.
-
Vše v Pythonu je objekt. Jazyk
nabízí veškeré výhody objektového programování.
-
Klasické procedurální
programování
je zde však stále možné.
-
Jednoduché používání
vysokoúrovňových datových typů (n-tice, pole, asociativní pole,
komplexní čísla,...).
-
Programátor není obtěžován
množstvím zbytečných podrobností, může se soustředit na jádro problému.
-
Python nabízí jednu z
nejkratších
cest od počáteční abstrakce projektu k funkčnímu programu.
-
Dle mého zatím nejlepší jazyk
pro
počáteční seznámení a výuku programování.
-
Python mohutně využívají
například
Google ("Python has been an important part of Google
since the beginning, and remains so as the system grows and evolves."),
Industrial Light & Magic -- ILM ("Python plays a
key role in our production pipeline. Without it a project the size of
Star Wars: Episode II would have been very difficult to pull off.")
nebo NASA ("... Python has met or exceeded every
requirement we've had."). [http://www.python.org/Quotes.html]
-
Dokumentační řetězce ke všemu,
co
uživatel definuje (třídy, metody, funkce...), jsou přímou součástí
kódu. Je možné k nim přímo přistupovat z
programu nebo interpreteru.
-
Ilustrace síly Pythonu a jeho interpreteru pro zvídavé:
$ python # Spuštění interpreteru Python 2.2.2 (#1, Jan 30 2003, 21:26:22) [GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-112)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def tisk(cislo=1, cislo2=2): # Zde definujeme funkci ... 'Tiskne dve zadana cisla, prip. bere vychozi hodnoty' ... print "Prvni cislo:", cislo ... print "Druhe cislo:", cislo2 ... >>> tisk() # Volání funkce bez argumentů Prvni cislo: 1 Druhe cislo: 2 >>> tisk(3,4) Prvni cislo: 3 Druhe cislo: 4 >>> tisk(cislo2=4) # Volání s pojmenovanými argumenty Prvni cislo: 1 Druhe cislo: 4 >>> dir.__doc__ # Dokumentace předdef. funkce "dir([object]) -> list of strings\n\nReturn an alphabetized list of names comprising (some of) the attributes\nof the given object, and of attributes reachable from it: \n\nNo argument: the names in the current scope.\nModule object: the module attributes.\nType or class object: its attributes, and recursively the attributes of\nits bases.\nOtherwise: its attributes, its class's attributes, and recursively the\nattributes of its class's base classes." >>> dir() # Co máme k dispozici za identifikátory? ['__builtins__', '__doc__', '__name__', 'tisk'] >>> dir().__doc__ # Dokumentace VÝSLEDKU funkce dir() "list() -> new list\nlist(sequence) -> new list initialized from sequence's items" >>> dir(tisk) # Co poskytuje naše funkce tisk? ['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__name__', '__new__', '__reduce__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name'] >>> tisk.__class__ <type 'function'> >>> str(tisk.__class__) # Vše můžeme zpracovat jako řetězec "<type 'function'>" >>> tisk.__doc__ 'Tiskne dve zadana cisla, prip. bere vychozi hodnoty' >>> tisk.__name__ 'tisk' >>> tisk.func_code <code object tisk at 0x8171578, file "<stdin>", line 1> >>> tisk.func_defaults (1, 2) >>>
-
Příklad výše ukazuje jen zlomek zajímavých vlastností
Pythonu.
Jeho interpretr umožňuje okamžité hrátky s ještě neexistujícím kódem.
Bleskově se lze dotazovat na schopnosti objektů, funkci a pokusně je
volat. Ideální pro zdokonalování představ, výuku, ukázky principů...
Výhody Zope
-
Systém je zcela otevřený,
obklopený
velkou a ochotnou komunitou. Jeho producent je se svým rozhodnutím
stále spokojen a jeho zaměstnanci s komunitou spolupracují.
-
Vše uvnitř jsou objekty -- jde
se
tedy dál než u obvyklých open source programů, kde si to, co se mi
nelíbí, přepíšu. Zde to, co se mi nelíbí, předefinuji -- odvodím nové.
-
Naprosto stejné prostředí lze
spustit jak ve Windows, tak i v Unixu. Pojem portování aplikace zde
vlastně nemá smysl.
-
Lze přímo připojit k množství
vnějších zdrojů/programů/nástrojů: Wysiwyg editory, předřazený webový
server, SQL databáze, LDAP, SMTP, IMAP, POP, NNTP a cokoli se
doprogramuje, přičemž jazyk Python již má
obrovskou softwarovou základnu.
-
Zope odstiňuje programátora od
detailů HTTP přenosu. Bez prezentační vrstvy orientované čistě na HTML
se vlastně programuje obecná objektová aplikace využívající persistenci
(viz dále). V metodě není nutné napsat ani řádek navíc,
chceme-li přijmou data z formuláře a publikovat výsledky.
-
Zope publikuje "ven" obecné
objekty
(nikoli pouze stránky).
-
Téměř úplně lze spravovat a
vyvíjet
přes webové rozhraní ZMI (Zope Management Interface). To
nabízí velice efektivní práci s kartami, což jsou vlastně různé pohledy
na aktuální objekt.
-
V ZMI lze funkčnost většiny i
těch
nejmenších stavebních kamenů aplikace ihned otestovat. Zope se
automaticky dožaduje vstupních hodnot a prezentuje výsledky.
-
Týmová spolupráce na vysoké
úrovni
(delegování práce).
-
V ZMI je k dispozici
vyčerpávající
kontextová nápověda a programátorská reference včetně fulltextového
vyhledávání. Každý produkt jednoduchým postupem registruje svou
nápovědu do hlavního stromu.
-
Aplikaci je kdykoli k
dispozici
asociativní pole REQUEST s daty webových formulářů, sušenkami (cookies),
daty HTTP požadavku, atd...
-
Zope se chová jako framework:
Často
k dosažení cíle není potřeba žádné programování, úkoly jsou prováděny
standardním předdefinovaným způsobem.
-
Jazyk Python poskytuje vynikající nástroj pro ladění - tracebacks.
Dojde-li kdykoli při provádění aplikace k nečekané události a
vygenerovaná výjimka není na své cestě ven z vnořených metod odchycena,
dojde k zapsání podrobných informací o stavu aplikace do protokolu chyb
Zope. Tyto informace zahrnují čas, uživatele, URL, typ a popis
výjimky, kompletní data HTTP požadavku, zejména však výpis vnořených
metod a funkcí včetně čísel řádků od ZPublisheru (viz dále) až k
místu výskytu problému (traceback alias backtrace).
Správci stačí kontrolovat protokol a má k dispozici ucelené ladící
informace o problému, na který narazili uživatelé aplikace.
Nevýhody Zope
-
Každý provozovatel řešení na
bázi
Zope musí mít trvale k dispozici alespoň jednoho člověka, který
celý komplexní a originální systém výborně ovládá a připravuje tvůrčí
prostředí ostatním. Těm stačí kratší nebo vůbec žádné školení (podle
jejich zaměření).
-
V porovnání s jinými řešeními generování dynamického webu
Zope
v absolutní rychlosti vyřizování požadavků prohrává. Je to dáno
robustností operace publikování objektů namísto prostého provedení
skriptu a substituce dynamického textu do stránek. Pro informaci:
Téměř celé samotné Zope je soustava zdrojových textů jazyka Python
(včetně jeho internetového serveru!).
Součásti Zope
(zdroj: Building
Dynamic WebSites with Zope)
- modře
- základní součásti
- hnědě
- umožňuje sbalit objekty do balíku plnícího služby dané
aplikace, instance těchto tříd jsou pak využívány k poskytnutí
vysokoúrovňových služeb
- červeně
- uživatelské programy (třídy), specifická aplikační
rozšíření
- zeleně
- třídy Zope plnící běžné požadavky webu
Některé z těchto součástí mohou být vytrženy z celku a používány
samostatně. Jsou navíc vlastně volitelné.
Jiná interpretace struktury (zdroj: ZopeBook):
ZServer
-
Komunikace se světem.
-
Multithreadový internetový
server
obsluhující množství protokolů:
-
HTTP (Web)
-
Fast-CGI (připojení Zope
"za"
Apache)
-
FTP (přímé obousměrné
zpřístupnění objektové hierarchie)
-
XML-RPC (standard pro
mezisystémovou komunikaci otevřeným textovým protokolem ve stylu
"volám tenhle tvůj objekt s parametry těchto typů", "vracím ti
výsledek tohoto typu", automatická a otevřená spolupráce počítačových
systémů založená na otevřeném samopopisujícím se
protokolu)
-
Python monitor
-
WebDAV (pohodlná WYSIWYG
editace
objektů na dálku)
-
WebDAV klienti např.:
Mozilla
a Netscape Composer, MS Office, cadaver
-
... nebo v podstatě libovolný editor s jednoduchým
adaptérem,
který za něj bude komunikovat se Zope
ZPublisher
-
Object Request Broker, který
požadavky mapuje na průchod hierarchií trvale uložených objektů (URL
traversal) a vrací výsledek transparentní interpretace/vyjádření
objektu (rendering).
-
Příklad takové publikace
objektu:
-
Metoda method
může být
šablona HTML stránky nebo obecného XML dokumentu, Z SQL metoda, Python
Script, Externí metoda, cokoli, co lze "renderovat". Vše je zcela
transparentní.
-
Většina objektů je tím vlastně
jednoduše a automaticky publikována.
-
Bere se zde ohled na oprávnění.
ZODB
-
Přímo součást Zope. Úložiště
všech
objektů, zde se objekty aktivují a také kešují.
-
Trvalé (persistent) instance objektů - programátor
se
nestará o žádné ukládání na disk. V Pythonu prostě napíše
self.promenna_objektu = ['Petr', 'Pavel']
a tato proměnná (vlastnost v
ZMI)
natrvalo obsahuje tento seznam (string, číslo, asociativní pole, odkaz
nebo instanci třídy...).
-
Automatické předcházení
konfliktům.
-
Může být transparentně
distribuovaná mezi více servery (ZEO) - škálovatelnost, lepší
dostupnost, rozložení zátěže, automatická replikace.
-
Transakce jsou typu
ACID (Atomic – Transactions are atomic (all or
none), Consistency
– A consistent state of the database may be expected at all times, Isolation
– Transactions are isolated from another; race conditions ensure that
multiple transaction instances attempts do not collide, Durable –
Once a transaction commits, it’s updates survive even, if the system
goes down.) a zcela transparentní, bez jakékoli další
péče. Změny provedené od příchodu požadavku až po odeslání výsledku
prohlížeči jsou buď přijaty jako celek (commit) nebo jako celek
odvolány (rollback).
-
Pokud relační databáze na
pozadí
podporuje transakce, Zope je zařadí do svého transakčního schématu.
Opět žádné programování navíc.
-
Versioning objektů,
vícenásobné Undo.
-
Uložena v jediném souboru data.fs , čas od
času je
vhodné ze ZMI provést "packing" pro eliminaci nepotřebných verzí
objektů.
Principy
Získávání (Acquisition)
-
Pouze v Zope, jeden ze
základních
principů fungování systému.
-
Dědění zdrojů na základě
umístění
objektu nebo místa volání v hierarchii databáze.
-
Objekty Zope jsou obsaženy v
jiných
objektech (např. objektech typu Folder), to vytváří hierarchii.
-
Objekty "získávájí"
vlastnosti (data) a chování (metody) z objektů typu složka, které je obsahují.
-
Podobné principu dědičnosti u
tříd,
ale místo vztahu předek-z něj definovaný následník je zde vztah
obsahující-obsažený.
-
Důsledky:
-
Kdekoli v hierarchii, ve
webové šabloně, ve skriptu, atp. zavolám něco
bez adresování.
-
Toto něco je
prostý
identifikátor, může to být šablona, skript, atribut, vlastnost...
-
Hierarchie bude prohledána
od
místa volání směrem ke kořeni.
-
Nalezenému objektu bude
jako kontext
předáno místo volání.
-
On se tedy bude chovat
tak,
jakoby se nacházel ve volající složce.
-
Výsledek volaného
(vlastnost
je prostě vrácena, metoda provedena, šablona renderována) je vrácen
volajícímu.
-
Volající může být i URL
ukazující někam hlouběji do struktury (elegantní sběr chybových hlášek
a implicitních stránek -- vše je definováno na jednom místě a chová
se dynamicky).
-
Toto poskytuje obrovské
možnosti opětovného využití veškeré práce, ať už se jedná o
šablony, skripty, ZSQL metody...
-
Jednoduchá změna chování celého podstromu (např. struktury
webových stránek) pouhým doklikáním několika společných proměnných
(vlastností složky). Překrytí nadřazeného pro daný podstrom.
Zabezpečení
-
Oprávnění se vztahuje
na
kolekci metod.
-
Role popisují třídy
uživatelů.
-
Rolím se přiřazují oprávnění.
-
Uživatelé se spojují s rolemi
pomocí definování v objektu UserFolder a místními rolemi.
-
SSL spojení.
-
Připojitelné autentizační moduly (podobné Linuxovému
systému
PAM):
Samotné Zope, databáze, LDAP, Unix nebo NT...
SQL přístup k relačním databázím
(RDBMS)
-
Podpora všech důležitých RDBMS
systémů (vč. např. ODBC).
-
Objekt spojení "database
connection"
v hierarchii poskytuje sdružování požadavků a jednoduchou
keš.
-
Objekt "Z SQL Method" se váže na dané spojení a poskytuje
objektově orientovanou abstrakci.
Základní objekty
Objekty obsahové vrstvy
Folder
-
Může obsahovat všechny ostatní
objekty a sdružuje je do jedné hierarchie.
-
Jako ze všech tříd, jde i z třídy Folder děděním odvodit
třídu
vlastní, která pak obsahuje objekty, zobrazuje se v ZMI jako složka,
funguje v ní získávání.
File, Image
-
Objekt třídy File
slouží k
ukládání libovolných dat.
-
Udržuje si vlastnost content
type
dle standardu MIME (např. application/pdf nebo text/plain)
-
Při vkládání se Zope z přípony
snaží tento typ uhodnout, lze samozřejmě změnit nebo upravit až při
jeho publikování.
-
Třída Image je potomek
třídy
File. Chová se tedy stejně jako obecný soubor.
-
Navíc v ZMI zobrazuje svůj
náhled,
z běžných formátů obrázků jsou přečteny rozměry a uloženy jako
vlastnosti.
-
V případě volání "metody" Image je vrácen košatý HTML
element <IMG> .
Objekty prezentační vrstvy
Page Template (ZPT)
-
Jedna ze dvou v současnosti
podporovaných prezentačních technik Zope. Využívá jazyk TAL (Template
Attribute Language).
-
Zdroják stránky je legální
HTML
(dokonce XHTML).
-
Dynamičnost je dodávána
zvláštními XML
atributy ze jmenného prostoru tal .
-
Obvyklé šablonové jazyky jsou
"jednosměrné": pouze od designéra stránek k programátorovi.
-
TAL umožňuje trvalou
spolupráci
designéra a programátora na jediném zdrojovém textu.
-
Designér je po krátkém
zaškolení
odstíněn od logiky aplikace. Má vždy k dispozici HTML stránku, kterou
může upravovat.
-
WYSIWYG editory webů si
neznámých
atributů nevšímají, ty žádné školení nepotřebují. Proto TAL používá
atributy a ne elementy, které by mohly být náhodně eliminovány.
-
Seznam všech příkazů
(atributů) TAL: tal:attributes, tal:define, tal:condition,
tal:content, tal:omit-tag, tal:on-error, tal:repeat, tal:replace
-
TAL pracuje na principu překrývání
existujícího obsahu šablony obsahem dynamickým.
-
Stejným postupem může TAL
sestavovat
dynamický XML dokument.
-
Podpora pro přehledné
seskupování
informací do dávek typu Předchozích/dalších 10 výsledků.
-
Příklad -- iterace přes výsledky nějaké metody files
ve složce, ve které se nachází i tato šablona (container )
a zobrazení příslušných položek asociativního pole item
(iterační proměnná).
... <tr tal:repeat="item container/files"> <td><a href="Sample.tgz" class="filename" tal:attributes="href item/getId" tal:content="item/getId">Sample.tgz</a></td> <td tal:content="item/getContentType">application/x-gzip-compressed</td> <td tal:content="item/getSize">22 K</td> <td tal:content="item/bobobase_modification_time">2001/09/17</td> </tr> ...
Kdyby na prvním řádku bylo here/files , byla
by
metoda files získána naopak z místa volání.
Text nacházející se uvnitř elementů <td> je slepý a
bude příkazem content dynamicky nahrazen. Tato technika
pomáhá vizuálnímu návrhu stránek:
TALES
-
Standard TAL Expression
Syntax
popisuje syntaxi výrazů, které dodávají příkazům TAL a METAL data, ale
není na ně vázána.
-
Výraz se skládá z volitelné
předpony ukončené dvojtečkou -- určuje typ.
-
Seznam typů: path,
exists,
nocall, not, string, python
-
Seznam vestavěných jmen: nothing,
default, options, repeat, attrs, CONTEXTS, root, here, container,
template, request, user, modules
-
Příklady:
request/URL template/title here/title container/title user/getUserName python:1+2 string:Hello, ${user/getUserName} request/cookies/verbose | nothing
METAL
-
Standard Macro Expansion
Template Attribute Language je nástroj pro předzpracování
maker HTML/XML.
-
Pro zjednodušení se omezíme na
prezentovanou HTML stránku.
-
Makra jsou způsob jak
definovat a spojit dohromady kus nějaké stránky/šablony
(např. kalendář, pár vstupních polí pro přihlášení, hlavičku stránky,
postranice).
-
Šablona pak svá makra sdílí s ostatními objekty, takže změna makra na
jednom místě má okamžitý efekt.
-
Příklad -- odkazovaná (master_page ) šablona:
<p metal:define-macro="copyright"> Copyright © 2003, <em>Méďa Béďa</em> s.r.o. </p>
Odkazující se šablona (složka templates
může být získána
z nadřazené struktury):
<hr> <b metal:use-macro="here/templates/master_page/macros/copyright"> Zde bude copyright </b>
-
Odkaz na makro může být
dynamický
pomocí výrazu TALES.
-
Makra lze dále dělit do
podobným
způsobem definovaných slotů. Jejich naplněním lze ve volající
šabloně upravit obsah makra.
-
Příklad -- v hlavní šabloně je definován hlavní navigační
panel
v jednom slotu a ponecháno místo na dodatečné, nevyplněné, informace:
<div metal:define-macro="sidebar"> <div metal:define-slot="links"> Links <ul> <li><a href="/">Domů</a></li> <li><a href="/products">Produkty</a></li> <li><a href="/support">Podpora</a></li> <li><a href="/contact">Kontakt</a></li> </ul> </div> <span metal:define-slot="additional_info"></span> </div>
Odkazující se šablona si přeje standardní navigaci a dodá
další informace. Chce-li, může předefinovat i slot s odkazy samotnými:
<p metal:use-macro="container/master_page/macros/sidebar"> <b metal:fill-slot="additional_info"> Nenechte si ujít naše <a href="/specials">speciality</a>. </b> </p>
-
Sloty mohou být i do sebe
vnořeny.
-
V praxi se podřízená šablona
odkáže
na makro hlavní šablony webu rovnou v elementu <html>
a pak už jen vyplňuje sloty. Celý web pak může vycházet z jediné
šablony s jednotnou strukturou. Tak funguje nadstavba Plone.
-
Seznam všech příkazů METAL: metal:define-macro,
metal:use-macro, metal:define-slot, metal:fill-slot
DTML Method (DTML Document)
-
Starší prezentační jazyk.
Logika se
do stránky vkládá zvláštními elementy. Jeho nevýhody vyplývají
z předchozího.
-
V DTML se programuje rychleji,
obsahuje více složitějších programátorských konstrukcí. Neurčuje tedy
tak striktně jako ZPT/TAL oddělení prezentační a logické vrstvy
aplikace.
-
Jak ZPT, tak i DTML jsou
skriptovací
jazyky prováděné serverem. Posílá se již čisté HTML.
Nejsou tedy např. problémy s nekompatibilitou JavaScriptu prohlížečů.
-
Obě techniky bude Zope trvale
podporovat.
-
Seznam všech elementů
DTML: <dtml-call>,
<dtml-comment>, <dtml-functions>, <dtml-if>,
<dtml-in>, <dtml-let>, <dtml-mime>,
<dtml-raise>, <dtml-return>, <dtml-sendmail>,
<dtml-tree>, <dtml-try>, <dtml-unless>,
<dtml-var>, <dtml-with>
-
Příklad -- vložení získané hlavičky a patičky,
iterace
přes výsledky objektu actors a jejich zobrazení:
<dtml-var standard_html_header> <body> <h1>Actors in the movie Glengarry Glen Ross</h1> <table border="1"> <th>Name</th> <dtml-in actors> <tr><td><dtml-var sequence-item></td></tr> </dtml-in> </table> </body> <dtml-var standard_html_footer>
Objekty vrstvy logiky aplikace
Script (Python)
-
Upřednostňovaný způsob
programování
logiky aplikací.
-
Obsahuje proceduru v jazyce
Python s
definovanými vstupními parametry, vrací výsledek libovolného typu.
-
Vracené pythonské datové typy
(ordinální, seznamy, asociativní pole) lze triviálním způsobem
prezentovat ve volajících šablonách.
-
Skript je instancí objektu,
ale
principiálně je vlastně i metodou objektu složka. Podobný
pohled lze mít i na všechny ostatní objekty složek: I šablona webové
stránky je vlastně metoda své složky. Je-li ve složce podsložka, může
metodu zdědit (mechanismem získávání) a zároveň upravit své
chování. Jedná se o princip objektově orientovaného programovaní
rozšířený na hierarchii podobnou složkám a souborům.
-
Pomocí objektů Script
(Python)
lze tvořit v podstatě libovolně složitou webovou aplikaci. Vztahují se
na ně však bezpečnostní omezení -- zejména není možné
přistupovat vně Zope na hostující server (soubory, síť, apod.) a je
omezen přístup k většině standardních modulů (knihoven) jazyka Python.
Po zvážení lze určitý modul zpřístupnit.
-
Každý skript je spuštěn na
svém
vlastním "písečku" (sandbox), který potlačuje následky
programátorských chyb -- nekončené smyčky, obsazení paměti, apod.
-
Příklad -- po načtení skriptu se mu nastaví vlastnosti
interpretací řádků, které začínající znaky ## . To
umožňuje jednoduchou distribuci skriptů:
##parameters=status ##title=Vrací všechny podobjekty s danou vlastností status. results=[] for object in context.objectValues(): if object.getProperty('status') == status: results.append(object) return results
External Method
-
Moduly v jazyce Python uložené
ve
speciálním adresáři na souborovém systému. Nelze je vytvářet ze ZMI
(ochrana).
-
Nemají bezpečnostní omezení,
mohou
se chovat jako běžné programy na hostujícím OS a používat libovolné
pythonské moduly.
-
Funkce v externím modulu mají
zároveň přístup k volajícímu kontextu v hierarchii Zope pomocí
svého parametru s obvyklým názvem self .
-
Nehodí se pro definici uživatelských tříd, které by měly
být
integrovány do Zope (k tomu slouží tzv. Produkty).
Z SQL Method
-
Zvláštní druh metody pro
tvorbu
logiky aplikace.
-
Obsahuje šablonu SQL
příkazu
odesílaného databázi.
-
Daný seznam vstupních
parametrů,
substituce do příkazu SQL včetně typové kontroly.
-
Metoda obsahující příkaz SELECT
vrací seznam asociativních polí pro jednotlivé řádky výsledku.
-
Seznam elementů DTML pro Z SQL
metody: <dtml-sqlgroup>, <dtml-sqltest>,
<dtml-sqlvar>
-
Příklad -- dvě složitější metody:
INSERT INTO requisitions ( department_id, description, quantity, unit_cost ) VALUES ( <dtml-sqlvar department_id type=string>, <dtml-sqlvar description type=string>, <dtml-sqlvar quantity type=int>, <dtml-sqlvar unit_cost type=float> ) select * from employees <dtml-sqlgroup where> <dtml-sqltest salary op=gt type=float optional> <dtml-and> <dtml-sqltest first op=eq type=nb multiple optional> <dtml-and> <dtml-sqltest last op=eq type=nb multiple optional> </dtml-sqlgroup>
Další zajímavé objekty
ZCatalog
-
Indexování objektů pro
prohledávání
různými metodami ("indexy"), ukládání různých typů informací o
objektech.
-
Může být použit jako vyhledávací stroj nebo pro programátorské účely
(volání z metod).
-
Objekty, u kterých to má smysl ("CatalogAware"), se
indexují
samy a po změně reindexují.
Browser Id Manager, Session Data
Manager, Transient Data Container
-
První z nich sbírá a třídí
informace o přistupujících prohlížečích.
-
Druhý spravuje data uložená
aplikací
pro jednotlivé sessions (sezení).
-
Třetí je umístěn většinou ve
složce temp
vhodné pro ukládání takových dat (RAM přidělená Zope) a data o sezeních
udržuje.
-
Správce serveru Zope se o tyto
věci
vůbec nemusí starat. Tyto tři objekty jsou po nainstalování Zope v
kořenovém adresáři, pracují zcela automaticky a každý objekt hierarchii
je může získat.
-
Výsledek je ten, že programátor jednoduše ve skriptu
napíše
toto:
session = context.REQUEST.SESSION session['nakoupeno'] = 1 session['nakup'] = { 'chleba' : 1, 'maslo' : '20 dkg' }
V rámci sezení jsou pak tato data (zde dvě informace v
asociativním poli -- hodnota 1 a asociativní pole obsahující různé
typy) i nadále k dispozici s nulovou programátorskou námahou.
Mimochodem, je zde ilustrováno, že jazyk Python si s datovými typy
opravdu nedělá hlavu.
Set Access Rule
-
V případě přistoupení
ke
složce (traversing) je takto možno nastavit, která metoda se má
vyvolat. Je to vlastně takový "autoexec" pro složku.
-
Lze tím zařídit libovolné změny
chování složek, úpravu oprávnění, apod...
Version
-
Umožňuje větvit práci na
vývoji
složky tak, že se tvůrce "připojí k pracovní verzi".
-
Pokud pracuje na verzi, vidí
ji
pouze on.
-
Je-li spokojen, změny
jednoduše
aplikuje nebo je může zrušit.
-
Zároveň je toto možnost, jak řešit konflikt práce více
lidí na
jedné složce.
Virtual Host Monster
Mail Host
Z Search Interface
-
Spíše utilitka: Na několik
kliknutí
lze pomocí něj vytvořit pár šablon -- formulář pro zadání informací a
šablonu se sestavou výsledků a dělením výsledků do skupin po n
výsledcích (batching).
-
Lze napojit na libovolný objekt, který se identifikuje
jako
prohledávatelný, tedy například ZCatalog nebo Z SQL metoda s příkazem SELECT .
RAM Cache Manager
Mohutnější stavební kameny
Produkty
-
Nové objekty nebo jejich
kolekce,
které se do Zope instalují přikopírováním jako pythonský modul do
speciálního adresáře na souborovém systému.
-
Aplikace pro Zope, jako jsou
diskuzní servery, databázové adaptery a stovky dalších se distribuují
tímto způsobem.
-
Po startu se Zope pokusí nainstalovat (integrovat do sebe)
všechny moduly, které najde v adresáři Products . Třídy
zde
definované mohou být se Zope logicky propojené pevněji než např. třídy
v externích metodách. Lze s nimi volněji pracovat.
ZClasses
-
Tvorba tříd odvozených od tříd
Zope
sestavováním přímo v ZMI.
-
Je možné automaticky zařazovat
do
katalogu.
-
Lze vytvořit libovolně se chovající objekty.
Síru dštící porovnání s PHP
-
Jazyk PHP neodděluje
prezentaci od
logiky, naopak vše integruje. To je hlavní brzda tvorby větších
projektů v něm. Programátor se jednoduše časem ztratí ve vlastním
programu.
-
PHP programátora neláká k
modularitě a objektovosti. Nabádá spíš ke tvorbě stylem 'vlep a sleduj,
co to udělá'. K nějaké koncepci se tvůrce musí donutit sám. Málokterý
se dostane tak daleko.
-
Zdrojový text PHP je velice
nepřehledný. Každý programátor se totiž do jednoho zdrojového souboru
snaží vložit jak logiku, tak prezentaci (vč. vlivu celkové koncepce
webu) a design! Jen málo programátorů se může pochlubit dobrými
schopnostmi ve všech třech oborech.
-
Mění se a vyvíjí rychleji, než
je
na programovací jazyk zdrávo. Mnoho programátorů, kteří k němu přešli
např od Perlu, jej zase opustilo, protože se zde mezi majoritními
verzemi najednou změnilo rozhraní a oni by svoje hotové programy
museli přepisovat.
-
Python je (podobně jako Perl)
jako
jazyk nesrovnatelně stabilnější a stejně jako Zope je dobře navržen.
Není potřeba ani po letech nic měnit.
-
Jako doklad tohoto tvrzení:
Zope je
tvořeno několika megabajty textových definic tříd. Když jeho tvůrce Jim
Fulton chtěl přidat transparentní vyvažování zátěže a překlenutí
selhání (failover), stálo ho to pouhé dva týdny práce a
výsledek měl jen 100 KB! To prostým přidáním k systému s dobrým
návrhem, který předtím tyto schopnosti vůbec neměl. Bylo při tom
využito mnoho kódu, který v Zope již byl.
-
Zope je od začátku dobře navrženo, nemění se. Spíše se v
něm
semtam nacházejí úsměvné anachronismy v názvech. Programátoři
nereptají, jen žijí s vědomím, že Zope, ač je postaveno na velice
moderních a praktických technikách, má i svou historii.
Plone
-
Rozšíříme-li Zope o produkt
CMF (Content
Management Framework), můžeme nainstalovat další produkt -- Plone.
-
Jedná se o kompletní CMS (Content
Management System).
-
Rovnou po nainstalování je
zcela
bez programování možné začít tvořit web zaměřený na publikaci dokumentů
různých typů včetně prohledávání, podpory workflows
(definovaných pracovních postupů), ad.
-
Plone má profesionální a
jednotný
design a lze jednoduše použít jako webové rozhraní intranetu. Pomocí
maker a slotů METAL, které ono samo používá, lze připojovat vlastní
aplikační moduly.
-
Plone by si zasloužilo více místa na popis. Možná příště.
Structured text
-
Jeden z typů dokumentů, který
je
standardně v prostředí Plone možné vytvořit za účelem publikace.
-
Prostý text (bez jakýchkoli
značek
jako HTML), který však přesto obsahuje informace o struktuře dokumentu
(odsazením od levého okraje), odkazech, tabulkách, zvýraznění apod.
-
Má-li se takový text
publikovat,
vyrenderuje se automatickým převedením do HTML.
-
Výhody:
-
Zdroj je stále přehledný,
jednoduchý a přitom je bez námahy prezentován s profesionálním
vzhledem.
-
Autorem může být po
krátkém
vysvětlení kdokoli, nemusí znát HTML.
-
Výsledek designově zapadne
do
celkového návrhu, neobsahuje definice, které by se bily se zbytkem
stránky, do které je vložen.
-
Zdroj se hodí i ve své prosté podobě, např. pro
prohledávání. Je skvěle čitelný a přehledný.
Použité zdroje
-
Python
language website
http://www.python.org
-
Český portál jazyka Python
http://www.py.cz
-
Český portál uživatelů Zope - Zope User
Group v ČR
http://www.zug.cz
-
Zope Book -
oficiální dokumentace systému Zope
http://www.zope.org/Documentation/Books/ZopeBook
-
Gain
Zope Enlightenment By Grokking Object Orientation
http://www.zope.org/Members/mcdonc/HowTos/gainenlightenment
-
Building
Dynamic WebSites with Zope
http://www.dieter.handshake.de/pyprojects/zope/book/book.html
-
Zope: a Developers
Overview
http://nuxeo.com/docs/zope-dev-bxl
-
Python
Web Frameworks Overview: Zope
http://www.boddie.org.uk/python/web_frameworks_Zope.html
-
Brief Overview of the
Zope Architecture
http://www.taupro.com/AboutZope/overview
-
Technical Summary
of Zope
http://www.taupro.com/AboutZope/techsummary
|