# Zope

Zope est un serveur d'applications web orienté objet, libre, écrit en langage de programmation Python et gérable à partir d'une interface Web. Zope publie sur le réseau des objets Python enregistrés dans une base de données objet, ZODB. Il existe une communauté grandissante de petites entreprises créant des applications web sur mesure à base de Zope$^,$.

## Histoire

Zope apparut lorsque son entreprise créatrice, Digital Creations (aujourd'hui Zope Corporation), a libéré le code source de ses produits phares, Bobo puis Principia, en 1998.

## Caractéristiques techniques

Un site Zope est composé d'objets dans une base de données objet, et non dans des fichiers comme d'autres systèmes de serveurs web. Cette approche exploite les technologies objet comme l'encapsulation. Zope relie les URL aux objets par la hiérarchie de contenu de tels objets. Ces objets possèdent comme il se doit des méthodes.
Zope est fourni avec une base de données d'objets Zope Object Database (ZODB), qui sérialise de manière transparente les objets dans une base de données transactionnelle.
Zope emploie fréquemment l'acquisition. Cette technique ressemble à l'héritage de classe : les objets "héritent" du comportement de leur contexte dans une hiérarchie de composition et non de leur classe supérieure dans une hiérarchie de classes. Cela permet de structurer le code source de façon plus simple, et peut encourager la décomposition d'application. On peut par exemple structurer la manière dont des éléments sont placés sur une page web. L'acquisition implantée dans Zope 2 est aussi parfois source de bugs, car elle peut entraîner des comportements inattendus. Son utilisation a été fortement restreinte dans Zope 3 afin d'éviter les résultats non désirés.
Zope fournit plusieurs procédés pour appliquer des patrons à de l'HTML : le DTML (Dynamic Template Markup Language, Langage de Balisage de Patron Dynamique ) et ZPT (Zope Page Templates, Patrons de Pages de Zope). Le DTML est un langage de balisage permettant d'implanter des scripts simples dans les patrons. Le DTML permet l'inclusion de variables, de conditions et de boucles. Toutefois, le DTML a des inconvénients majeurs : les marqueurs DTML mélangés au HTML forment des documents HTML non valides, et l'inclusion inattentive de logique dans les patrons produit du code illisible. ZPT est une technologie qui résout ces problèmes. Les patrons ZPT peuvent être soit des documents XML ou HTML bien formés, dans lesquels tout le marquage spécial se présente sous forme d'attributs dans le domaine de nom TAL (Template Attribute Language, Langage d'Attributs de Patrons). ZPT offre un ensemble limité d'outils pour l'inclusion conditionnelle ou répétitive d'éléments XML, ainsi les patrons sont habituellement assez simples, avec la majorité de la logique implantée en Python. Un avantage non négligeable des patrons ZPT est qu'ils peuvent être édités dans la plupart des éditeurs HTML graphiques. ZPT offre également la prise en charge directe de l'internationalisation.
Zope 2 sert de fondation aux systèmes de gestion de contenu Plone, Silva, Nuxeo CPS, Zwook et Chubaka.

## Zope 3 alias Bluebream

Zope 2 s'est avéré être un framework utile pour le développement d'applications web, mais son utilisation a révélé quelques défauts. Pour en citer quelques-uns, créer des produits pour Zope 2 requiert de copier une grande quantité de code d'initialisation, du code "magique" qui a juste besoin d'être là, et la logique du domaine est hautement liée à la logique de la présentation, ce qui rend difficile la création et la maintenance de versions sur mesure.
Zope 3 est une réécriture du logiciel qui vise à régler ces problèmes tout en gardant les avantages de Zope qui lui ont valu sa popularité. De plus, sa conception se veut moderne, avec une architecture à composants (délégation de tâches), utilisant massivement les interfaces et les adaptateurs (pour "connecter les composants entre eux"). Un objectif majeur est la qualité d'écriture du code (test unitaire, test fonctionnel, doctest, simplicité).
Cet effort sur le long terme a principalement été le fait de l'organisation de sprints permettant de motiver la communauté sur plusieurs années.
Une première version de Zope 3, Zope X3, a été diffusée le 6 novembre 2004. Le X signifie eXpérimentale. Néanmoins le déploiement à grande échelle par plusieurs développeurs ayant donné satisfaction, la lettre fut abandonnée. Se sont succédé les versions 3.1, 3.2 puis 3.3. Ces deux dernières se voient dotées du framework Python Twisted et d'une traduction complète en français.
Tirant les enseignements des premiers déploiements de Zope 3, la version 3.3 a vu une simplification de plusieurs éléments, et une volonté de se rapprocher de la communauté Python. Cet objectif passe par la publication des composants et l'utilisation des œufs (format Eggs, simplifiant grandement leur installation). Cet objectif est atteint avec la version 3.4 et en parallèle avec la version 2.12.
En 2010, pour clarifier la différence entre Zope 2 et Zope 3 Le projet Zope 3 est divisé en Zope Toolkit (ZTK) qui rassemble les bibliothèques de base qui sont aussi utilisées par Zope 2 et Bluebream qui rassemble toutes les autres composants spécifiques à Zope 3$^,$. "Zope" et "blue bream" sont les noms d'espèces de poissons, Ballerus ballerus.
Le 19 janvier 2011, la version 1.0 de Bluebream est distribuée. Elle est basée sur la version 1.0.1 Zope Toolkit et correspond à la version 3.5 de Zope 3.

### Cycle de vie et support

Le développement de Zope 4 a commencé fin 2017. Zope 4 est le successeur direct de Zope 2.13. Il a été maintenu jusqu'à fin 2022.
Zope 5 est sorti en 2020 et sera maintenu jusqu'à fin 2024.

## Remarques

Si l'une des finalités de Zope est la création de sites web dynamiques, sa philosophie orientée objet plutôt que pages web demande une certaine phase d'apprentissage.
Entre autres, Zope peut être utilisé comme serveur ftp, xml-rpc, WebDAV, http, mais peut facilement être utilisé avec un serveur web frontal, comme Apache. L'ajout du framework Twisted dans Zope 3.2 permettra à terme de créer ses propres protocoles.