Einleitung —

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

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.

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.

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.

++resource++_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.

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:

<role id="zope.Anonymous" title="Everybody" />
<grantAll role="zope.Anonymous" />

Dies gibt einem anonymen Benutzer uneingeschränkte Rechte!

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:

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:

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:

<class class="zcontact.contact.Contact">
  <require
      interface=".interfaces.IContact"
      permission="zope.View" />
  <require
      set_schema=".interfaces.IContact"
      permission="zope.ManageContent" />
</class>

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.