Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe...

12
Kerkstraat 19 Postbus 256 1400 AG Bussum The Netherlands e [email protected] t +31 (0)35 625 4545 f +31 (0)35 625 4555 http://www.antraciet.nl Een technische introductie Zope Martijn Pieters Antraciet BV [email protected] V1.2 - 26 september 1999

Transcript of Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe...

Page 1: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Kerkstraat 19

Postbus 256

1400 AG Bussum

The Netherlands

e [email protected]

t +31 (0)35 625 4545

f +31 (0)35 625 4555

http://www.antraciet.nl

Een technische introductie

Zope

Martijn Pieters Antraciet BV [email protected] V1.2 - 26 september 1999

Page 2: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Introductie

Het web is niet langer meer alleen een netwerk van statische informatie, maar een van applicaties. Bij de ontwikkeling van die applicaties wordt meer en meer gebruik gemaakt van Web Application Servers, die een framework bieden van voorzieningen speciaal gericht op het web. Zope is een Open Source Web Applicatie Server die een zeer complete set voorzieningen aanbiedt om zulke applicaties te bouwen. Zope staat voor Z Object Publishing Environment, is volledig object georiënteerd, en kan bijna geheel worden beheerd via zijn web interface. Het geschreven in de script taal Python, waarbij de snelheidsgevoelige delen geschreven zijn in C. In deze introductie geef ik een beknopt overzicht van de technische aspecten van deze software. Ik ga ervan uit dat de lezer bekend is met de grondbeginselen van het object georiënteerd programmeren. In deze introductie gebruik ik voornamelijk engelse termen voor deze begrippen.

Kort Overzicht

Zope draait om object publicatie. Een applicatie bestaat uit een hiërarchie van objecten, waarbij een URL door Zope wordt vertaald naar een methode aanroep op een object. Wanneer je een het absolute pad gedeelte van een URL (dus dat gedeelte na de host specificatie) van /deel1/deel2/deel3 hebt, dan wordt het object deel1 gevraagd om een object deel2, welke op zijn beurt weer om deel3 wordt gevraagd. Dit laatste onderdeel wordt gepubliceerd.

Zope zorgt ervoor dat alleen naar geautoriseerde personen het gevraagde object wordt gepubliceerd, verzorgt de vertaling van URL naar object, de vertaling van POST en GET data naar geschikte objecten, en de vertaling van het resultaat van de aanroep naar bruikbare vorm voor de aanvrager. Er zijn faciliteiten voor fout-afhandeling, relationele database integratie, standaard objecten, enzovoort. Zope is geschreven in Python, een zeer heldere, object georiënteerde script taal, zelf ook Open Source. Python is op zichzelf een zeer efficiënte en snelle taal, maar waar nodig zijn de bottlenecks uitgevoerd in C. Zope is geheel cross-platform, en draait op vrijwel alle systemen waar Python werkt.

Page 3: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Architectuur

Het onderstaande schema geeft een overzicht van de architectuur van een Zope Server:

Aan de voorkant ligt een protocol afhandelaar, die een verzoek van willekeurig protocol ontleed, en de na verwerking van dat verzoek, het antwoord weer geschikt maakt voor datzelfde protocol. Op het moment van schrijven worden de volgende protocollen ondersteund:

•= HTTP: Het web zelf, en het protocol waarvoor het resultaat van een Zope applicatie bedoeld is;

•= PCGI: Een protocol om via een klein en snel CGI programmaatje een verzoek aan een bestaande HTTP server door te sluizen naar de Zope Server. Hierdoor kunnen bepaalde features van een bestaande webserver worden benut, zoals bijvoorbeeld SSL;

•= FTP en WebDAV: twee manieren om bepaalde objecten in de ZODB, die daarvoor voorbereid zijn, te beheren;

•= XML-RPC: Een lichtgewicht protocol voor inter-applicatie communicatie;

•= Monitor: Vanaf de lokale host kan rechtstreeks in een Python interpreter in de server worden gestapt, waarna de objecten in Zope rechtstreeks benaderd kunnen worden. Zeer geschikt voor debug doeleinden.

Page 4: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Het framework zorgt voor authentisering en autorisatie, het ophalen van het verzochte object, de vertaling van de data van een verzoek in bruikbare vorm, en de afhandeling van foutmeldingen. Men kan ook dit framework volledig negeren, en in Python geschreven objecten rechtstreeks publiceren. Object in Zope zijn opgeslagen in een Object Database, de ZODB. De inhoud hiervan kan zowel op een filesysteem als in een relationele database worden opgeslagen. Het framework van Zope is eenvoudig uit te breiden met nieuwe diensten, zoals database adapters voor relationele databases, email verzenden via SMTP, authentisering via databases, LDAP servers en platte files, enzovoort.

Z Object Database

Objecten in Zope worden opgeslagen in een object database, de ZODB. Deze database is transactioneel en zorgt ervoor dat:

•= de staat van een object consistent, en persistent wordt opgeslagen, en dus onafhankelijk is van het al dan niet draaien van de server;

•= veranderingen in de staat van een object worden gevolgd en opgeslagen, zonder dat een ontwikkelaar daar veel meer voor hoeft te doen dan zich aan een paar simpele regels te houden;

•= alle veranderingen binnen een transactie vallen en alle veranderingen binnen één transactie alleen permanent worden gemaakt als er geen fout optreedt gedurende het verloop van de transactie;

•= oude transacties te allen tijde zijn terug te draaien, oneindige ‘undo’ dus;

•= objecten worden in het geheugen worden gecached, en worden gedeactiveerd wanneer zij niet meer worden aangeroepen;

•= multi-threaded verzoeken tot veranderingen in de ZODB niet met elkaar in conflict komen.

Een nieuwe aanroep start automatisch een nieuwe transactie, welke weer eindigt bij het einde van die aanroep. Ze zijn volledig transparant voor de ontwikkelaar. De inhoud van de object database is bijna volledig te beheren met een browser. Door de krachtige beveiligingsstructuur van Zope, en de webinterface is het zeer gemakkelijk en verantwoord om het beheer van delen van een website te delegeren. De ZODB ondersteund ook langlopende transacties, zogenaamde ‘Versions’.

Page 5: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Framework

Zope biedt de applicatie ontwikkelaar een framework aan van diensten, waarmee het bouwen van een Web Applicatie gemakkelijk wordt gemaakt; de ontwikkelaar hoeft hier niets (of niet veel) meer voor te doen. Deze diensten vallen uiteen in:

•= Standaard objecten

•= Web interface

•= Acquisitie

•= Beveiliging

•= Marshalling

•= Scripten Deze diensten worden hieronder ieder apart besproken.

Standaard Objecten

Zope biedt een pakket van standaard objecten aan, waarmee snel een dynamische site kan worden gebouwd, en waarmee met objecten een filesysteem kan worden gesimuleerd. Bovendien ondersteunen deze objecten alternatieve beheer protocollen zoals WebDAV en FTP., en spelen zij een belangrijke rol in de web interface van Zope. Verder kunnen nieuwe classes worden gebouwd met deze objecten, welke het ontwikkelen van eigen objecten vergemakkelijkt.

Folder De belangrijkste bouwsteen van een hiërarchische object structuur, en een belangrijk object in de beveiliging van een web applicatie.

Image Een image object vindt zelf de hoogte en breedte van een plaatje uit, en biedt een interface aan voor het genereren van een <IMG> tag met de juiste attributen.

File Binaire files die verder geen speciale interface behoeven, worden hiermee gemodelleerd.

DTML Document Gebruik dit object voor tekstuele inhoud, en andere tekstuele site elementen, waarbij het van belang is dat de inhoud via de web interface aan te passen is.

Page 6: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

DTML Method Met DTML Methods doe je het meeste script werk. Hiermee maak je nieuwe interfaces voor een applicatie, waarin je weer andere objecten kunt aanroepen.

External Method Maakt een in Python geschreven method beschikbaar in de Object Database. Gebruik dit daar waar een volledig in Python geschreven uitbreiding overkill zou zijn, maar waar wel functionaliteit nodig zou zijn die anders niet beschikbaar is. Je hebt hiervoor wel toegang tot het filesysteem nodig.

ZCatalog Indexeert andere objecten in de Object Database, voor het snel lokaliseren van specifieke objecten. Voor zoekfuncties op een site, en voor het dynamisch genereren van alternatieve views van de gegevens in je applicatie of site.

Database Connection Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits dat ondersteund wordt, in de transacties van Zope.

Z SQL Method Met een Z SQL Method geven toegang tot de SQL data in externe databases.

Page 7: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Web Interface

Dit is een screenshot van de web interface van Zope, datgene wat je ziet wanneer je voor het eerst een nieuw geïnstalleerde Zope Server gaat administreren.

Aan de linkerkant vindt je een hiërarchische boom van alle folder-achtige objecten in de object database. Dit vormt de navigatie. Aan de rechterkant zie je het werk gedeelte, waar je het huidige object bewerkt, in dit geval het root object. Langs de bovenkant vindt je een rij tab bladen, één voor elke administratieve actie die je op dat object kunt uitvoeren. Elk type object kan zijn eigen tab bladen definiëren. Deze interface is op te roepen door /manage toe te voegen aan een object URL. Als je dit doet voor een object dieper in de hiërarchie, dan past de navigatie zich hieraan aan; het laat dan alleen de sub-objecten van het gekozen object zien.

Acquisitie

Bij object georiënteerd programmeren wordt veel gebruik gemaakt van inheritance, de overname van gedrag van een andere class. Zope geeft de ontwikkelaar een nieuwe manier voor het definiëren van gemeenschappelijk gedrag: acquisitie. Bij acquisitie wordt gedrag niet uit een class hiërarchie overgenomen, maar uit de object hiërarchie. Inheritance is de overname van gedrag tijdens de ontwerpfase, acquisitie neemt gedrag over tijdens de uitvoerfase, en is dus veel dynamischer.

Page 8: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Het principe is simpel: Objecten worden binnen een ander object geplaatst, een container, en vormen zo een hiërarchie, een beetje zoals een filesysteem. Vanaf dat moment hebben de objecten binnen die container de beschikking over alle methoden en attributen van hun container. Bovendien zijn de objecten in de container zelf ook attributen van die container, en dus aanspreekbaar vanuit de andere objecten in de container. Dit is het beste uit te leggen met een voorbeeld: Het object A is een container, en definieert een methode hello_world. Deze is bereikbaar vanuit Zope met de URL /A/hello_world. In A stoppen wij het object B, en het object C, die zelf geen methoden of attributen hebben. Door acquisitie, is nu de URL /A/B/hello_world een geldige aanroep, want B kent nu ook een methode hello_world. Verder zijn /A/C/B/hello_world en /A/B/B/C/B/hello_world ook geldige aanroepen. Het voordeel hiervan is, dat je vrij hoog in je object hiërarchie, algemeen geldende functionaliteit en objecten kunt definiëren, en die je dan dieper in de object structuur op verschillende plaatsen kunt gebruiken. Dit wordt veel gebruikt voor templates, en is ook van groot belang voor Zope’s beveiligings-systeem.

Beveiliging

De beveiligings-architectuur van Zope houdt zich bezig met twee dingen: wie ben je (authentisering), en wat mag jij doen (autorisatie). Authentisering bepaalt wie de gebruiker is aan de hand van bijvoorbeeld het HTTP authentisering protocol en wat voor een soort dingen die gebruiker mag doen. Autorisatie daarentegen, houd zich bezig wat er gebeurt met een object. Namenlijk, welke privileges heeft een gebruiker nodig om een bepaalde actie uit te voeren. In Zope houd je dus informatie bij over gebruikers, en permissies voor objecten. Om te voorkomen dat je met een lange lijst van permissies per gebruiker eindigt (een applicatie kan immers uit heel veel objecten en methoden bestaan), hanteert Zope een abstractie tussen de gebruikers en de object operaties. Er zijn vier componenten die deze abstractie bewerkstelligen:

•= Gebruikers Hiermee worden de mensen die gebruik maken van een Zope applicatie gemodelleerd. Je geeft ermee aan wat voor toegang iemand heeft, en verzorgen de authentisering.

•= Rollen Rollen representeren een soort verantwoordelijkheid, een rol die iemand speelt binnen je applicatie, zoals ‘Werknemer’, of ‘Auteur’. Rollen linken authentisering met autorisatie, en lijken een beetje op groepen uit andere beveiligings-systemen.

Page 9: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

•= Permissies Permissies representeren bepaalde acties op je objecten, op een abstract niveau, zoals ‘bekijken’ en ‘wijzigen’. Een of meerdere methoden op een object vallen samen onder een permissie.

•= Acquisitie Met behulp van acquisitie worden de gemaakte beveiligings-instellingen doorgegeven naar de onderliggende objecten, zodat toegang tot een groep objecten centraal wordt geregeld.

Gebruikers en permissies koppel je aan elkaar door middel van rollen. Op een gegeven object ken je een permissie toe aan een rol, en door acquisitie ook op alle sub-objecten. Door nu een individuele gebruiker die rol te geven, krijgt die gebruiker het recht om de actie die door de permissie wordt gedekt, uit te voeren. Een voorbeeld: Een bepaald gedeelte van je applicatie is alleen toegankelijk voor dealers. De permissie ‘View’ geeft het recht om de interface van dat deel van de applicatie op te vragen. Je maakt dan een rol, genaamd ‘Dealer’, en geeft in het bedoelde gedeelte van je applicatie, die ‘View’ permissie aan die rol. Nu kun je gebruikers aanmaken voor al je dealers, die je de rol ‘Dealer’ meegeeft. Naast deze abstractie, kent Zope ook nog lokale en proxy rollen. Met lokale rollen geef je individuele gebruikers een rol op een individueel object. Een voorbeeld hiervan is de ‘Owner’ rol, die automatisch wordt gegeven aan de objecten die een bepaalde gebruiker creëert. Permissies gegeven aan die rol, gelden alleen op die objecten waar die gebruiker de lokale rol is gegeven. Permissies zoals ‘wijzigen’ geef je dan aan de ‘Owner’ rol, en dan kan alleen degene die het object heeft gecreëerd, ook weer wijzigen. Bij een proxy rol, geef je een rol aan de gebruiker van een bepaalde methode. Als de gebruiker een methode aanroept, ‘krijgt’ de gebruiker ook nog eens die extra rol, waardoor de aangeroepen methode ook andere, normaal niet toegankelijke acties kan uitvoeren.

Page 10: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Marshalling

In web applicaties worden vaak HTML formulieren gebruikt voor de invoer en bewerking van gegevens, welke daarna middels GET of POST requests naar de server worden gestuurd. Deze gegevens zijn echter beperkt tot tekst, er is namelijk geen concept van data typen. Met behulp van zogenaamde modifiers, toevoegsels aan de naam van formulier velden, zorgt Zope voor het omzetten van de gegevens naar andere data typen en structuren, zoals:

•= Numerieke gegevens: integer, long en float;

•= Lists (in andere programmeertalen meestal een array genoemd);

•= Records (gestructureerde data, bijvoorbeeld de gegevens van een persoon); Ook kan worden gespecificeerd hoe er moet worden gehandeld als bepaalde velden leeg zijn gelaten.

Scripten

Met behulp van DTML, de Document Markup Language, kun je tekstuele informatie genereren aan de hand van templates en informatie uit je applicatie. Meestal is dit HTML, maar je kunt er alle soorten tekst mee genereren. Het wordt bijvoorbeeld gebruikt door Z SQL Methods om SQL te genereren. Met DHTML kun je uiteraard op condities testen en zowel gegevens die door de browser zijn verstuurd als objecten in de object database manipuleren. Een belangrijke eigenschap is de mogelijkheid om het resultaat van andere DTML scripts in te voegen, het zijn immers ook objecten. Samen met acquisitie maakt dat een heel erg flexibel template systeem, waarbij veel gebruikte interface elementen in aparte objecten worden ondergebracht. En batches, het weergegeven van lange lijsten gegevens, verdeeld over meerdere schermen, is triviaal in Zope. DTML is vooral veilig. Je kunt derden de mogelijkheid geven scripts te maken, maar een DTML script kan nooit de server plat leggen, het onderliggende OS aanspreken, of op andere manieren de veiligheid van de server in gevaar brengen. Zo zijn oneindige lussen niet mogelijk. Omdat DTML uit te breidden is, zijn er zeer krachtige commando’s beschikbaar, bijvoorbeeld voor het verzenden van email, het creëren van een hiërarchische boom en voor het weergeven van een kalender.

Page 11: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

Applicatie Bouwen

Als je een applicatie wilt bouwen in Zope, dan zijn er meerdere wegen die naar Rome leiden, waarbij iedere weg weer geschikt is voor andere doeleinden.Er zijn in principe 3 manieren om functionaliteit in Zope te implementeren:

•= Standaard objecten

•= External Methods

•= Products Products zijn gespecialiseerde componenten, die elke Zope installatie kunnen worden gebruikt. Products zijn onder te verdelen in:

•= Products gebaseerd op standaard objecten

•= ZClasses

•= Python Products Meestal gebruik je een combinatie van bovenstaande methoden.

Standaard objecten

Je kunt een web applicatie bouwen, dat geheel uit de standaard objecten bestaat. Dit is vooral geschikt voor visueel georiënteerde websites, waar veel gebruik wordt gemaakt van DTML Methods als templates. Maar meestal worden deze objecten gebruikt ter ondersteuning en structurering van een complexere web applicatie. Folders zijn vooral erg handig voor het partitioneren en structureren van een web applicatie, waarbij je je objecten verdeeld over Folders naar gelang de beveiliging en logische structuur van je website. Verder gebruik je DTML Methods, Documents, Image en File objecten om de interface te definiëren.

External Methods

Met External Methods kun je kleine stukjes code schrijven in Python, waarmee je bijvoorbeeld systeem functies kunt aanroepen, of waarmee je code kunt schrijven die anders te complex zou worden in DTML. Deze code bevindt zich in een file op het filesysteem van de server waarop Zope draait, en er is dus toegang tot de machine nodig (FTP of Telnet).

Products Met Standaard Objecten

Als je een stukje web applicatie dat alleen maar uit Standaard Objecten is opgebouwd herbruikbaar wil maken, dan kun je het omvormen tot een Product. Het is dan mogelijk om nieuwe kopieën te maken van die standaard objecten, met elke keer wat gescripte aanpassingen, en dit Product is dan in te zetten op een willekeurige Zope installatie. Dit is

Page 12: Zope, Een Technische Introductie · 2008. 6. 24. · Dit object representeert een externe relationele database. Het zorgt voor connection pooling, en integreert die database, mits

vooral te gebruiken voor het creëren van template structuren, zoals bijvoorbeeld de opzet van een nieuwe site.

ZClasses

ZClasses zijn object classes die geheel via de web interface zijn de definiëren en te gebruiken. Object methoden worden gedefinieerd in DTML, External Methods en Z SQL Methods, en zij kunnen worden gebaseerd op alle Standaard Objecten. ZClasses zijn ideaal voor het modelleren van eenheden informatie binnen een web applicatie, zoals persberichten, artikelen en producten. De geprogrammeerde functionaliteit is meestal beperkt tot interfaces voor het manipuleren van de gegevens opgeslagen in een ZClass.

Python Products

Met Python Products heb je alle vrijheid, want je kunt hiermee alle aspecten van een Zope Server manipuleren. Hier is echter wel systeem toegang voor vereist. Python Products zijn meest geschikt voor complexe code en object systemen. Als je een interface naar andere software, of een nieuwe DTML tag wil maken, dan kun je niet om een Python Product heen.

Meer Informatie

Zope’s framework van diensten maakt het tot een van de meest complete Web Applicatie Servers op dit moment verkrijgbaar. Zijn snelheid, beschikbaarheid van de source en natuurlijk zijn prijs maken het een goede keus voor vele Web Applicaties. Voor meer informatie over Zope, kun je terecht op de volgende sites:

•= http://www.zope.org/ De officiële site van Zope, waar veel van de inhoud door Zope gebruikers wordt verzorgd. Een heel goed voorbeeld van wat er mogelijk is met Zope. Je vindt hier Zope zelf, documentatie, en vele Products.

•= http://zdp.zope.org/ De website van het Zope Documentation Project.

•= mailto:[email protected] De mailinglijst, en een goede bron voor directe ondersteuning.

•= http://www.python.org/ Informatie over de scripttaal waarin Zope is geschreven. De taal is heel helder, en gemakkelijk ik enkele dagen onder de knie te krijgen.