Введение в Zope

Brian Lloyd
Инженер-программист, Digital Creations
3 августа 1999 года

Опубликовано на английском на DevShed.com
URL:    http://www.devshed.com/Server_Side/Zope/Intro/

Перевод выполнен Дмитрием Саякиным.

Обзор

Zope - разработанный фирмой Digital Creations сервер приложений следующего поколения и набор средств разработки информационных порталов, доступный в исходных текстах. Он работает почти на всех UNIX платформах и Windows NT, может использоваться вместе с наиболее популярными WWW серверами или отдельно, используя встроенный WWW сервер. Zope написан на мощном объектно-ориентированном языке Python и может быть расширен с использованием последнего или языка С для компонентов с критичной производительностью.

В отличие от обычных файл-ориентированных систем обработки шаблонов, таких, как ASP и PHP, Zope представляет собой в высшей степени объектно-ориентированную платформу для решения большинства возникающих при разработке WWW-приложений задач со строгим разделением данных, логики и представлений, расширяемым набором встроенных объектов и мощной моделью безопасности. Инфраструктура Zope позволяет разработчику сосредоточиться на проблеме, избавляя от забот о доступности и целостности данных и управлении доступом.

Zope предоставляет все необходимые инструменты для интеграции информации из практически любого источника в мощные, цельные и удобные в сопровождении WWW-приложения:

Одна из особенностей, выделяющих Zope среди других серверов приложений - разработка его с самого начала была тесно привязана не только к объектной модели WWW, но и к модели WWW-разработки. Сегодня успешная разработка WWW-приложений требует участия экспертов в разных предметных областях. Zope разработан специально для поддержки такой модели, позволяя менеджерам сайтов делегировать часть полномочий экспертам по дизайну, по базам данных и информационному наполнению.

Платформа для WWW приложений

Технология, положенная в основу Zope, полностью объектно ориентирована. URL WWW ресурса на самом деле - путь к объекту в содержащей его иерархии объектов, а протокол HTTP - способ послать сообщение объекту и получить от него ответ.

Zope с самого начала разрабатывался для отражения объектной модели WWW. Объекты в нем - Каталоги, Документы, Изображения и SQL запросы - иерархически упорядочены, представляя внешне привычную среду, основанную на именах. К примеру, URL "/Marketing/index.html" используется для доступа к Документу "index.html" в Каталоге "Marketing".

Для создания объектов в Zope и работы с ними, Вы используете Ваш браузер для доступа к интерфейсу управления. Все связанное с управлением и разработкой приложений может быть выполнено удаленно с использованием WWW-браузера. Интерфейс управления представляет объектную систему Zope в виде, похожем на обычный Windows Explorer, позволяя разработчику создавать и описывать объекты и даже новые типы объектов, исключая необходимость доступа к файловой системе WWW сервера.


Фиг. 1 - Интерфейс управления Zope

Объекты могут располагаться в любом месте иерархии. Управляющие сайтом могут работать с ними, выбирая с помощью закладок нужные представления. Эти представления зависят о типа объекта. Объект типа DTML Документ, к примеру, имеет закладку "Edit", позволяющую редактировать исходный текст, в то время как объект типа Соединение с базой данных имеет закладки для изменения строки описания соединения и для редактирования параметров кэширования объектов. Все объекты, однако, имеют представление "Безопасность", служащее для управления полномочиями, необходимыми для доступа к объекту.


Фиг. 2 - Представление для правки объекта DTML Документ

Объекты Zope хранятся в высокопроизводительной транзакционной объектной базе данных, использующей файловую систему или RDBMS для долговременного хранения. Каждый WWW запрос рассматривается в ней как отдельная транзакция с автоматическим откатом изменений в случае ошибки в приложении. Предоставлена также возможность многоуровневой отмены сделанных изменений нажатием одной кнопки. Среда Zope делает все детали доступности данных и транзакций полностью прозрачными для разработчика.

Управление информационным наполнением

Сердце Zope - язык разметки шаблонов документов (Document Template Markup Language, далее DTML), мощный язык вставки переменных и обработки выражений для безопасного описания объектов и динамической генерации информации. DTML использует синтаксис SSI, привычный для большинства WWW-разработчиков и сильно связан с моделью безопасности Zope. Такая связь позволяет пользователям с низким уровнем привилегий создавать свои скрипты, не угрожая безопасности всего сайта.

Базовые возможности вставки переменных и обработки условий существенно расширены в DTML. Могут использоваться свойства и методы объектов Zope и, наравне с ними, WWW запросы и переменные форм. Следующий пример показывает свойство "Заголовок" запрашиваемого документа и специальное сообщение, если пользователь прошел авторизацию:


The title of this document is: <!--#var document_title-->. <p> <!--#if "AUTHENTICATED_USER=='Fred'"--> Hello Fred! <!--#else--> Hello stranger! <!--#/if-->

Конечно, DTML Документы в Zope могут включать содержимое других DTML Документов. Для создания общего дизайна Вашего сайта Вы можете использовать два DTML Документа, соответствующих головной и завершающей части страниц, и просто включать их при выводе информации:


<!--#var standard_html_header--> <h2>Welcome to our site!</h2> <!--#var standard_html_footer-->

DTML имеет мощный тэг "in" для итеративной вставки, позволяющий просто обрабатывать последовательности объектов и автоматически контролировать результаты пакетных операций (таких, как поиск или множественные WWW запросы). Пример показывает вызов объекта типа SQL Запрос и построение таблицы обходом результирующих объектов-записей:


<table> <!--#in getEmployees--> <tr> <td><!--#var first_name--></td> <td><!--#var last_name--></td> <td><!--#var job_title--></td> <td><!--#var hire_date--></td> <!--#/in--> </table>

Используя эти и многие более сложные конструкции DTML, разработчик может делать SQL запросы, создавать новые объекты, манипулировать свойствами объектов и создавать высокодинамичное содержание сайта. Следующий, более продвинутый, пример использует DTML тэг "sendmail" для отправки электронного письма из DTML кода. Пример предоставляет форму для заполнения с последующей отправкой письма, содержащего имя пользователя и комментарии:


<!--#var standard_html_header--> <!--#sendmail smtphost="mailsrv.mydomain.com"> To: Feedback Department <feedback@mydomain.com> From: Feedback Form <ff@mydomain.com> Subject: User Feedback <!--#var name--> writes: <!--#var comments--> <!--#/sendmail--> <h2>Thanks!</h2> <p> Thanks for your feedback! </p> <!--#var standard_html_footer-->

Ключевая концепция "безопасных скриптов" состоит в том, что, в отличие от других систем обработки шаблонов, DTML не позволяет создавать произвольные программные блоки, способные нарушить защищенность сервера. Вместо этого, Zope предлагает просто другой тип объекта, Внешний Метод, инкапсулирующий более сложные программные механизмы с возможностью включения произвольного кода. Авторы DTML могут вызывать Внешние Методы для использования их сервисов, но сами Внешние Методы являются объектами Zope с соответствующими правами и установками безопасности. Это дает возможность управляющему сайтом избирательно предоставлять расширенные сервисы DTML-авторам без необходимости давать им право на исполнение произвольного кода на сервере.

В большинстве случаев возможностей одного DTML достаточно для обычных задач, а более продвинутые тэги, предлагаемые Zope, могут сократить необходимость в разработке сложных скриптов. Например, тэг "tree" позволяет с минимумом усилий создать раскрываемый элемент управления типа дерева, аналогичный используемому в левой части интерфейса управления Zope. Толковый справочник пользователя DTML доступен в различных форматах на WWW сайте Zope.

Доступ к данным

Zope предоставляет единообразный объектно-ориентированный доступ ко всем типам источников данных масштаба предприятия, как к реляционным базам данных, так и к данным таких источников, как сервера LDAP и IMAP. В Zope поддержано большинство применяемых баз данных, включая Oracle, Sybase, MySQL и доступные по ODBC.

Для организации доступа к данным, Вы заводите (с помощью мыши) объект типа Соединение с базой данных, соответствующий используемому источнику, после чего можете создавать SQL Методы - запросы, использующие соединение. В SQL Методах может использоваться DTML для создания динамических запросов на основе данных из форм или переменных окружения. В приведенном ниже SQL Методе с названием "getTasks" выбираются данные из таблицы "tasks", базируясь на идентификаторе авторизованного пользователя:


select * from tasks where emp_id='<!--#var AUTHENTICATED_USER-->'
Результаты этого запроса теперь можно включить в DTML Документ, просто обращающийся к запросу и последовательно обрабатывающий результаты:


<h2><!--#var AUTHENTICATED_USER-->'s tasks</h2> <table> <!--#in getTasks--> <tr> <td><!--#var title--></td> <td><!--#var due_date--></td> </tr> <!--#/in--> </table>

Объектно-центрический дизайн Zope позволяет достичь четкого отделения данных от их представления. Программисты баз данных могут работать над SQL Методами, контент-менеджеры могут просто вызывать последние и использовать результаты для наполнения страниц. Такая объектная модель упрощает сведение данных из многих источников. Расширенные возможности доступа к данным делают возможным даже определение "поведения" данных, превращая записи реляционных таблиц в "разумные данные" Ваших Zope-приложений.

Еще одно преимущество разработки в среде Zope - автоматическое распространение транзакций на внешние базы данных. Если Ваша реляционная база данных поддерживает этот механизм, Zope автоматически начнет транзакцию перед выполнением SQL Метода, связанного с этой базой, и автоматически подтвердит транзакцию при успешном выполнении WWW запроса. При возникновении ошибки при выполнении запроса транзакция будет отменена, делая транзакционную целостность данных полностью прозрачной для разработчика.

Встроенный механизм поиска

Быстрое, гибкое и настраиваемое полнотекстовое индексирование и поиск объектов любого типа в Zope обеспечивается включением объектов типа Z-Каталог. Объекты могут быть найдены как по "содержанию", так и по свойствам, что упрощает структурный поиск, такой, например, как поиск по авторам или типам объектов.

Такой объектный подход к индексированию делает возможным построение WWW сайтов со сквозным поиском, интегрирующих данные из многих источников. Вместо обычного списка документов результаты поиска на Zope-сайте могут включать в себя документы, почтовые сообщения из списков рассылки, записи из реляционных баз данных или ресурсы из LDAP каталога.

Разделение данных

Одним из наиболее мощных аспектов Zope является простая, но изысканная модель разделения данных. Эта модель известна как "Acquisition" (приобретение, усвоение, заимствование) и ее основная мысль в двух словах:

Лучше всего демонстрировать заимствование на примере. Ранее мы решили инкапсулировать наши, общие для всего сайта, начальные и конечные части страниц в отдельные DTML Документы, включаемые по необходимости. Этот дизайн был бы быстро нарушен, будь нам нужно создавать копии заголовка и окончания в каждом Каталоге, делая их доступными информационным документам. Заимствование позволяет нам избежать этого. Мы создаем начало и конец в Каталоге верхнего уровня, а DTML Документы в нижних уровнях иерархии автоматически "заимствуют" их сверху при необходимости.

Концепция заимствования работает для всех объектов Zope и предоставляет чрезвычайно мощный способ централизации общих ресурсов. Широко используемый SQL запрос, например, может быть определен в одном Каталоге и автоматически использоваться благодаря заимствованию в объектах подчиненных каталогов. При необходимости изменения Вы можете не заботиться обо всех подобъектах и вносить исправления в одном месте.

Так как объекты заимствуют свойства, начиная с текущего уровня содержащей их иерархии с поиском вверх, для выделения специализированных областей на сайте требуется минимум работы. Например, если у Вас на сайте есть Каталог "Sports", содержащий информацию, относящуюся к спорту, Вы можете создать в нем новые "спортивные" по оформлению заголовок и окончание. Содержащиеся в каталоге "Sports" и его подкаталогах объекты будут использовать его оформление, а не оформление, заданное на верхнем уровне сайта.

Применениям заимствования можно посвятить несколько статей. Для целей поверхностного обзора, однако, главным является то, что с использованием этого метода можно исключить избыточные данные и повысить удобство обслуживания сайта.

Безопасное делегирование полномочий

Успех WWW сайта зависит от совместной работы многих людей в организации: разработчиков приложений, экспертов по SQL, контент-менеджеров, а часто и конечных пользователей. На обычном сайте удобство поддержки и безопасность часто становятся проблемой. Насколько Вы контролируете контент-менеджера? Как повредит безопасности допуск последнего на сайт? Что, если ASP файлы, с которыми ему придется работать, содержат SQL код - это может открыть Ваш код доступа к базе данных?

Ответ на эти вопросы дан в Zope благодаря строгому объектному дизайну и гибкой модели безопасности, специально разработанных для отражения уникальных бизнес-моделей WWW.

В Zope управление пользователями строится на основе Каталогов Пользователей - специальных каталогов, содержащих информацию о пользователях. Доступны дополнения к Zope, предоставляющие расширенные типы Каталогов Пользователя, берущих информацию о пользователях из реляционных баз данных или каталогов LDAP.

Объекты Zope предоставляют значительно больший спектр возможных полномочий, чем традиционные файл-ориентированные системы. Различные типы объектов в зависимости от их возможностей предоставляют различные полномочия. К примеру, Вы можете так управлять полномочиями, что контент-менеджер сможет вызывать SQL Метод, но не изменить его или даже не увидит его текста. Возможно установить такие ограничения, что доступным пользователю станет создание лишь некоторых типов объектов, скажем, Каталогов и DTML Документов, но не SQL Методов и прочих.

В дополнение к строгой инкапсуляции и безопасности, Zope предоставляет и другие возможности для совместной работы. Кроме WWW-доступа, в нем естественно поддержаны и другие протоколы, такие, как FTP, WebDAV и XML-RPC. Такой основанный на стандартах поход позволяет работать с Zope, используя существующие авторские инструменты.

Даже со всеми удобствами для совместной работы, что-то время от времени идет наперекосяк. Но и в этом случае, вместо пробежки за лентой с запасной копией, управляющий сайтом может просто войти в интерфейс менеджера Zope и отменить изменения на сайте вплоть до точки возникновения неприятности. А для полного исключения такого сорта проблем, пользователи могут работать с Версиями - частными представлениями объектной системы.

Изменения, производимые в Версиях, видны лишь другим пользователям, работающим внутри них и не затрагивают видного всем внешнего вида сайта. По завершении изменений внутри Версии и их проверки пользователь может их подтвердить и сделать доступными всем.

Поддержка XML

Горячей темой на рынке серверов приложений стала сегодня поддержка XML. Как обстоит с этим дело в Zope? Наряду с реализацией основанных на XML протоколов, таких, как WebDAV и XML-RPC, Zope поставляется с быстрым, написанным в основном на С парсером XML, который могут использовать разработчики приложений и даже объектная база данных сервера может быть экспортирована в формате XML. Доступен также прототип дополнительного объекта "XML Документ", дающего пользователю возможность загрузить на сервер Zope XML документ с одновременным грамматическим разбором и сохранением элементов в виде индивидуальных объектов. Это позволяет использовать DTML для генерации отчетов по подмножествам элементов или индексации последних для нужд поиска.

В связке с XML, Zope поддерживает API Document Object Model (DOM, объектная модель документа) и разработчики могут работать с объектами Zope на DTML или Python с помощью привычных вызовов DOM. Будущее поддержки XML, судя по текущим проектам, естественная обработка XSL и возможность поиска в иерархиях Zope с использованием XQL (XML Query Language, язык запросов XML).

Дополнительная информация

Zope легко расширяем, и продвинутые пользователи могут создавать собственные типы объектов, разрабатывая дополнения на языке Python или полностью через WWW. Программное окружение предоставляет несколько полезных встроенных компонентов в помощь авторам расширений, в том числе устойчивый набор рамочных классов, заботящихся обо всех деталях имплементации новых объектов Zope.

Существует большое число дополнительных продуктов, дающих возможность организации WWW дискуссий и публикацию данных из настольных систем, XML инструменты и средства интеграции с системами электронной коммерции. Многие из этих продуктов были разработаны очень активными членами Zope-сообщества, а большинство имеет открытые исходные тексты.

Фирма Digital Creations, опубликовавшая Zope, предлагает различные варианты консультативной и технической поддержки, включая поддержку высокомасштабируемых/высокодоступных WWW серверов масштаба предприятия.

Дополнительная информация, документация и программные пакеты для Zope и расширений доступно на сайте Zope www.zope.org. Имеется ряд почтовых рассылок для пользователей и разработчиков - хорошее место узнать побольше о Zope.