© Raphael Volz 2001 Zope Grundlagen Seminar – Praktikum Knowledge Portals Raphael Volz Slide 1 © Raphael Volz 2001 Agenda • Verwaltung von Zope Objekten • Zugriff auf Zope Objekte • Grundlegende Zope Techniken – DTML – Python – Zope API Slide 2 © Raphael Volz 2001 Globale Systemarchitektur Slide 3 © Raphael Volz 2001 Objektdatenbank • Transparente Persistenz für alle Objekte • Transaktionen, Multi-User fähig • Versionierung, Undo-Fähigkeiten Slide 4 © Raphael Volz 2001 Klassen • Modellieren „Inhalt“ (Content) • Haben Eigenschaften • Ordner (Folder) Können andere Objekte enthalten. Erzeugen eine Objekt-Hierarchie. • DTML Dokumente Dynamische Erzeugung von Dokumenten. Nutzen DTML (Document Template Markup Language) Erzeugung von Inhalt • ... Slide 5 © Raphael Volz 2001 Methoden • Modellieren „Prozesse“ • Keine Eigenschaften • Bekommen Kontext von aufrufendem Objekt • DTML Methoden „Inhalt-erzeugende Prozesse“ • Python Skripte Begrenzter Zugriff auf Python-Bibliotheken „Inhalt-verarbeitende Prozesse“ • Externe Methoden Python Skripte mit unbeschränktem Zugriff auf Sicherheitskritische Dinge (Dateisystem ...) Slide 6 © Raphael Volz 2001 Eigenschaften • Manche Zope-Objekte haben zusätzlich Eigenschaften (Properties) • Bsp.: Ordner, Bilder, DTML Dokumente ... • NICHT: Methoden • Mittels Eigenschaften können zusätzliche Informationen mit einem Objekt verbunden werden • Eigenschaften sind typisiert (string, int ...) • Bsp.: Titel ... Slide 7 © Raphael Volz 2001 Agenda • Verwaltung von Zope Objekten • Zugriff auf Zope Objekte • Grundlegende Zope Techniken – DTML – Python – Zope API Slide 8 © Raphael Volz 2001 Zugriff auf Objekte • Akquisition Ein Objekt hat Zugriff auf alle Objekte, die sich entlang des Pfades vom Objekt in Richtung Wurzel befinden. • Beispiel: Zoo/LargeAnimals/giraffe/feed Slide 9 © Raphael Volz 2001 Request-Objekt • Wird bei jedem Aufruf eines Zope-Objektes durch einen Clienten neu erzeugt • Enthält Wichtige Daten vom Clienten, z.B.: – – – – Aufgerufene URL Formulardaten Cookies Parameter • DTML-Tipps: – <dtml-var REQUEST> gibt alle Elemente des REQUEST Objekts aus. – <dtml-var REQUEST.set('Semester','WS01/02')> Erzeugt eine neue Variable „Semester“ innerhalb des RequestObjekts Slide 10 © Raphael Volz 2001 Zugriff auf Variablen • Zugriff auf Variablen und Objekte über Namen (identifier) • Variablen können an verschiedenen „Orten“ definiert sein: – – – – Request-Objekt innerhalb Objekt Objekt-Eigenschaft innerhalb Objekthierarchie • Jeder „Ort“ definiert einen Namensraum (namespace) Slide 11 © Raphael Volz 2001 Finden von Variablen Owner: „Stadt K‘he“ REQUEST Name: „Hans“ Min_weight: 100 Remote_Addr: 192.168.1.1 Name: „Petra“ • Variablen werden zuletzt im Request-Objekt gesucht. • Für das Client Object gelten die Regeln der Akquisition • Nutzung eines bestimmten Namensraums kann erzwungen werden Slide 12 © Raphael Volz 2001 Agenda • Verwaltung von Zope Objekten • Zugriff auf Zope Objekte • Grundlegende Zope Techniken – DTML – Python – Zope API Slide 13 © Raphael Volz 2001 DTML • Document Template Markup Language • Proprietär • Dynamische Erzeugung von Inhalten (z.B.: HTML, XML, ...) • „_“ wird als Namespace-Variable bezeichnet. – Darüber erfolgt Zugriff auf die Zope API und freigegebene Python-Bibliotheken. – Bsp.: <dtml-var „_.math.fabs(-10.1)“> Ausgabe: „10.1“ Slide 14 © Raphael Volz 2001 DTML-var • Ausgabe von Variablen und Objekten • Ausgabe ist typ-abhängig – Datei (File) Inhalt – Bild (Image) Link zu Bild und Img-Attribute – ... • Attribute – Name Namen, der im Namespace nachgeschlagen werden soll – Expr Auswertung von Python-Ausdrücken (gemäß PythonSyntaxregeln – Fmt Formatierung der Ausgabe • Beispiele – ... Slide 15 © Raphael Volz 2001 DTML-call • Aufruf von Aktionen • Keine Ausgabe • Beispiel: <dtml-call "REQUEST.set('die_großen_B',['Bach','Beethoven'])"> <dtml-call "die_großen_B.append('Brahms')"> <dtml-var die_großen_B> Slide 16 © Raphael Volz 2001 DTML Verzweigungen • <dtml-if>, <dtml-else>, <dtml-elif>, <dtml-unless> • Beispiele: <dtml-if snake> Die Variable/Objekt „snake“ existiert </dtml-if> <dtml-if expr="num > 5"> num is greater than five <dtml-elif expr="num < 5"> num is less than five <dtml-else> num must be five </dtml-if> Slide 17 © Raphael Volz 2001 DTML Iteratoren • <dtml-in> durchläuft Mengen • Das aktuelle abgerufene Element wird oben auf den Namespace-Stapel gelegt. Beispiel: <table> <dtml-in objectValues> <tr <dtml-if sequence-odd>bgcolor="#EEEEEE" <dtml-else>bgcolor="#FFFFFF" </dtml-if> <td><dtml-var title></td> </tr> </dtml-in> </table> Slide 18 © Raphael Volz 2001 Veränderung des Namespace-Stapel • Deklaration/Veränderung von Variablen: <dtml-let preis=„100“> • Auswahl eines Namespace <dtml-with REQUEST only> <dtml-if id> <dtml-var id> <dtml-else> 'id' was not in the request. </dtml-if> </dtml-with> (Neuer) Namespace wird ganz nach oben sortiert Slide 19 © Raphael Volz 2001 Ausnahmebehandlung • <dtml-try>, <dtml-except>, <dtml-finally>, <dtml-raise> • Beispiel: <dtml-try> <dtml-var expr="1/0"> <dtml-except ZeroDivisionError> Teilung durch Null geht nicht. </dtml-try> Slide 20 © Raphael Volz 2001 DTML Beispiele • Cookie-Management • Formularbehandlung Slide 21 © Raphael Volz 2001 Cookie Management • Setzen eines Cookie: <dtml-call "RESPONSE.setCookie('favorite_food', ‚Fried Fish', expires='Mon, 22 Oct 2001 14:29:00 GMT')"> • Auslesen eines Cookie: <dtml-if "REQUEST.has_key('favorite_language')"> <dtml-var favorite_language> </dtml-if> Slide 22 © Raphael Volz 2001 Formularverarbeitung Input <form method=post action="form_process" ENCTYPE="multipart/form-data"> <P>Was sind Ihre Lieblingsgerichte <SELECT NAME="send_to:list" MULTIPLE> <OPTION>Schnitzel</OPTION> <OPTION>Bockwurst</OPTION> <OPTION>Sauerkraut</OPTION> <OPTION>Semmelknödel</OPTION> <OPTION>Saumagen</OPTION> </SELECT> <input type=submit value=„Abschicken"> </form> </P> form_process <dtml-if send_to> <p> Sie mögen gerne: </p> <ul> <dtml-comment> Über alles ausgewählte iterieren </dtml-comment> <dtml-in send_to> <li> <dtml-var sequence-item> </li> </dtml-in> </ul> <dtml-else> <p>Sie essen wohl nichts...</p> </dtml-if> Slide 23 © Raphael Volz 2001 Python-Skripte • Entwicklung in der Sprache Python • Eingeschränkter Zugriff auf Standard Python Module • Attribute des Skripts müssen angegeben werden • Bindings Slide 24 © Raphael Volz 2001 Bindings • Context Objekt, welches das Skript aufruft; auch „acqusition parent“ • Container Ordner, in welchem das Skript abgelegt ist • Script Selbstreferenz auf das Skript • Namespace Nur bei Aufruf aus DTML heraus: Namespace des Aufrufenden • Subpath Teil der URL nach dem Skriptnamen (Liste von Strings) Nutzung wie jedes andere Python-Objekt Slide 25 © Raphael Volz 2001 Rückgabe aus Python-Skripten • Standard Python Rückgabe „return“ • Umlenkung der Standardausgabe: – „print“ Statements wie normal nutzen – „return printed“ Slide 26 © Raphael Volz 2001 Zope API • Siehe Zope Book Appendix A + B • Beispiel ObjectManager-Methoden: – manage_addProduct['OFSP'] Mapping-Methode, die Zugriff auf Objektkonstruktoren des OFSP ermöglicht. – manage_addFolder(id, title) Objektkonstruktor für einen Ordner DTML: <dtml-call "manage_addProduct['OFSP'].manage_addFolder(id, title)"> Python: context.manage_addProduct['OFSP'].manage_addFolder(id, title) Slide 27 © Raphael Volz 2001 Python-Skript Beispiel <form action="addEntryAction" method="POST"> <p> Du bist: <input type="text" name="guest_name" value="Anonymous"> </p> <p> Deine Weisheit (HTML erlaubt): <br> <textarea name="comments" rows="10" cols="60"></textarea> </p> <p> <input type="submit" value="Erleuchte mich"> """ </p> Create a guest book entry. </form> """ DTML Doc „enter“ # create a unique document id id='entry_%d' % len(context.objectIds()) • Gästebuch # create the document context.manage_addProduct['OFSP'].manage_addDTMLDocument(id, title="", file=comments) # add a guest_name string property doc=getattr(context, id) doc.manage_addProperty('guest_name', guest_name, 'string') Skript „addEntry“ – comments, guest_name sind Parameter Slide 28