.. index:: introduction, z3c.*, Philipp von Weitershausen Einleitung ********** In den letzten neuen Monaten, kurz nachdem Philipp von Weitershausen die zweite Auflage des Buches *Web Component Development with Zope 3* veröffentlicht hatte, wurde Zope 3 stark umstrukturiert und verändert. Aufgeteilt in hunderte Teile, wurde aus Zope 3 "Zope 3 das Framework". Alle Zope-Komponenten wurden in separate Pakete aufgeteilt und werden nun im egg-Format unter Berücksichtigung aller Abhängigkeiten verteilt. Eine andere große Änderung der letzten neun Monate war die Erstellung neuer Zope-Komponenten, die nicht zum "Zope-Kern" gehören. Dazu zählen auch die z3c.*-Komponenten. Diese Komponenten wurden vor allem von rebellischen Zope-3-Hackern erschaffen, um Zope noch leistungsfähiger zu machen. Leider haben die Entwickler, die die z3c-Komponenten unglaublich produktiv und erfolgreich einsetzen und wissen wie man sie nutzt, kaum Zeit ein neues Buch, Tutorial oder eine Dokumentation zu schreiben. Dieses Dokument soll das Leid derjenigen verringern, die immer noch den alten Weg gehen und eine einfache Einführung zu den z3c.*-Komponenten benötigen. Wer sollte dieses Tutorial (nicht) lesen ======================================== Dieses Tutorial ist für Leute geschrieben, die bereits Erfahrungen mit Zope 3 haben. Es wird davon ausgegangen, daß ein gewisses Verständnis für die grundsätzlichen Paradigmen von Zope (Komponentenarchitektur, ZCML-Konfiguration, Tal-Page-Templates und natürlich Python) vorhanden ist. Zu diesen Themen gibt es schon einige Bücher. Wenn Sie noch keines gelesen haben, empfehle ich einen Blick in das Buch *Web Component Development with Zope 3* von Philipp von Weitershausen zu werfen und es als Ergänzung für dieses Tutorial zu nutzen. Baiju Muthukadan hat ebenfalls ein gutes Buch über die Interna der Komponentenarchitektur geschrieben, welches Sie unter folgender Adresse finden können: http://www.muthukadan.net/docs/zca.html Die Vorbereitungen ****************** .. index:: virtual environment, virtualenv.py, sandbox Einrichtung einer virtuellen Umgebung ===================================== Bevor Sie mit der Arbeit an der Anwendung beginnen, ist es immer von Vorteil eine separate Python-Umgebung einzurichten, die unabhängig vom auf dem System installierten Python ist, egal welche Linux-Distribution wir verwenden (in meinem Fall, ist es Ubuntu Gutsy). Mit der virutuellen Umgebung vermeiden Sie auch Probleme, die mit dem System-Python verbunden sein können, wie defekte Pakete, Konflikte bei den Abhängigkeiten usw. Eine virtuelle Python-Umgebung kann ganz einfach mit dem Script *virtualenv.py* erstellt werden, welches unter folgender Adresse heruntergeladen werden kann http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py. Was dieses Skript macht, kann auf der pypi-Homepage unter http://pypi.python.org/pypi/virtualenv nachgelesen werden. Laden Sie das Skript herunter und speichern es in den home-Ordner. Erstellen Sie dann eine neue Umgebung mit dem Namen sandbox: $ python ~/virtualenv.py sandbox Alternativ kann die Umgebung auch anderswo gespeichert werden und auch eine andere Bezeichnung erhalten. Die neue Umgebung enthält ein Unterverzeichnis bin mit einem ausführbaren Python und einem Skript easy_install. Es existiert auch ein bash-Skript das die Shell auf die neue Umgebung umstellt. Damit muss nicht mehr der volle Pyhon-Pfad in der neuen Umgebung angegeben werden. Starten Sie das Skript mit:: $ cd sandbox $ source bin/activate Danach kann man sehen, dass es funktioniert:: (sandbox)$ which python /home/pcardune/sandbox/bin/python Von nun an wird immer davon ausgegangen, dass die virtuelle Umgebung aktiviert ist, wenn ein shell-Kommnado auszuführen ist. .. index:: zopeproject, Philipp von Weitershausen, easy_install Die Verwendung von zopeproject ============================== Es ist hilfreich mit einem Gerüst für die Anwendung zu beginnen, damit man sich keine Gedanken über die Grundkonfiguration machen muss. Glücklicherweise hat Philipp von Weitershausen ein exzellentes Programm `zopeproject `_ geschrieben, das genau diese Aufgabe übernimmt. zopeproject kann mit ``easy_install`` installiert werden. Geben Sie dazu ein:: $ easy_install zopeproject Als nächstes erstellen Sie ein neues Projekt, das Sie zcontact nennen. Das Programm zopeproject erstellt eine komplette, leere Zope-Anwendung, in die man sich als Administrator einloggen kann. Es wird nach einem Benutzernamen und einem Passwort für den Admin (was jederzeit wieder geändert werden kann), sowie einem Speicherort für die benötigten Komponenten gefragt:: $ zopeproject zcontact Enter user (Name of an initial administrator user): manager Enter passwd (Password for the initial administrator user): zcontact Enter eggs_dir (Location where zc.buildout will look for and place packages) ['/home/pcardune/buildout-eggs']: eggs Dieser Schritt kann ein wenig dauern, weil viele Dateien geladen werden müssen und einige davon werden auch noch kompiliert. Während dieser Zeit können Sie sich die Dokumentation zum `zopeproject `_ ansehen, um eine Vorstellung davon zu bekommen, was dieses Programm macht. .. index:: paster Den Server starten ================== Wenn die Installation abgeschlossen ist, kann die Applikation gestartet werden, sie läuft standardmäßig auf Port 8080.:: $ cd zcontact $ ./bin/paster serve deploy.ini Starting server in PID 23818. serving on http://127.0.0.1:8080 Sie sollten jetzt einen Bildschirm sehen, der in etwa, so aussieht. .. image:: images/screen1.png Die Datei ``deploy.ini`` enthält die Konfiguration für das Programm ``./bin/paster`` z. B. Angaben zum Port. Das Programm ``zopeproject`` generiert auch die Datei ``debug.ini`` mit einem WSGI-Filter zur Handhabung von Fehlern. Wann immer Fehler auftreten, kann diese Konfiguration zur Fehleranalyse mit dem Browser verwendet werden. .. index:: security, role, grantAll Sicherheitseinstellungen ======================== Damit diese Anleitung möglichst einfach zu handhaben ist, ändern Sie die von ``zopeproject`` erzeugten Rechte und haben dadurch später keine Rechte-Probleme mehr. Sie erreichen das, indem Sie die folgenden Zeilen in der Datei ``site.zcml`` im Start-Verzeichnis des Projekt-Ordners hinzufügen: .. sourcecode:: xml Dies gibt einem anonymen Benutzer uneingeschränkte Rechte! .. index:: interface, implementation Erstellen eines einfachen Interfaces und die Implementation =========================================================== Bevor Sie mit den z3c.*-Komponenten beginnen können, brauchen Sie ein paar Objekte, mit denen Sie experimentieren können. Weil ZContact als Kontakt-Manger fungieren soll, beginnen Sie mit einem Kontakt-Objekt. Zur Vereinfachung verwenden werden nur Vornamen und den Nachnamen verwendet. .. note:: Der Quelltext liegt im Ordner ``zcontact/src/zcontact`` und das Modul ``zcontact/src/zcontact/interfaces.py`` kann mit ``import zcontact.interfaces`` importiert werden. Das Interface IContact ---------------------- Erstellen Sie die Datei ``interfaces.py`` und fügen Sie folgendes ein: .. sourcecode:: python import zope.interface import zope.schema class IContact(zope.interface.Interface): """A simple contact.""" firstName = zope.schema.TextLine( title=u"First Name", required=True) lastName = zope.schema.TextLine( title=u"Last Name", required=True) Die Implementierung von Contact ------------------------------- Jetzt können Sie die Implementierung vornehmen. Dafür sind folgende Zeilen in die Datei ``contact.py`` einzufügen: .. sourcecode:: python import zope.interface from zope.schema.fieldproperty import FieldProperty import interfaces class Contact(object): """See ``zcontact.interfaces.IContact``.""" zope.interface.implements(interfaces.IContact) firstName = FieldProperty(interfaces.IContact['firstName']) lastName = FieldProperty(interfaces.IContact['lastName']) Sicherheitseinstellungen für die Contact-Klasse ----------------------------------------------- Sie müssen nun die ``Contact``-Klasse registrieren und setzen die Rechte für den Zugriff auf die Attribute. Fügen Sie die folgenden Zeilen in die Datei ``src/zcontact/configure.zcml`` ein: .. sourcecode:: xml Wenn dies vollbracht ist, können Sie mit den Ansichten (Views), die die z3c.*-Komponenten verwenden, beginnen. .. Note:: Nicht vergessen: Im richtigen Leben würde man zuerst Unit-Tests für die Klasse ``Contact`` erstellen, um sicherzugehen, dass das ``IContact``-Interface korrekt implementiert wurde.