DTML

Werbung
© 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
Herunterladen