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

Architekrura 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):


Zope Architecture

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:

    • URL: http://myhost/object1/object2/method?count:int=1&name=foo

    • Je mapováno takto:

      • metoda method

      • dílčího objektu object2

      • dílčího objektu object1 dostupného z kořenové složky

      • bude volána s argumenty count=1, name="foo"

    • Pravidla pro zpřístupnění objektu z webu.

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

  • Objekt umožňující správu několika virtuálních webových serverů v rámci jednoho Zope.

  • Možnost dynamických úprav URL (rewriting) a směrování požadavků.

Mail Host

  • Při vytvoření je zde zadán SMTP server a následně je pomocí něj možné odesílat poštu.

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

  • Do složek lze přidat i tento objekt keše (mezipaměti) pro udržování výsledků šablon, skriptů a metod. Při správném nastavení se tím mohou operace výrazně zrychlit.

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

  1. Python language website
    http://www.python.org

  2. Český portál jazyka Python
    http://www.py.cz

  3. Český portál uživatelů Zope - Zope User Group v ČR
    http://www.zug.cz

  4. Zope Book - oficiální dokumentace systému Zope
    http://www.zope.org/Documentation/Books/ZopeBook

  5. Gain Zope Enlightenment By Grokking Object Orientation
    http://www.zope.org/Members/mcdonc/HowTos/gainenlightenment

  6. Building Dynamic WebSites with Zope
    http://www.dieter.handshake.de/pyprojects/zope/book/book.html

  7. Zope: a Developers Overview
    http://nuxeo.com/docs/zope-dev-bxl

  8. Python Web Frameworks Overview: Zope
    http://www.boddie.org.uk/python/web_frameworks_Zope.html

  9. Brief Overview of the Zope Architecture
    http://www.taupro.com/AboutZope/overview

  10. Technical Summary of Zope
    http://www.taupro.com/AboutZope/techsummary