среда, 16 апреля 2008 г.

z3c-tutorial. 2 глава!

Это вторая глава переводимой мной документации z3c-tutorial, оригинал которой доступен по адресу http://docs.carduner.net/z3c-tutorial. Итак, поехали!

2 Приступая к работе


2.1 Установка виртуального окружения

Прежде чем мы начнем работать над нашим приложением, хорошей идей будет настроить окружение питона, которое отделено от системного питона, предустановлого с каким-то используемым вами дистрибутивом linux (в моем случае это Ubuntu Gutsy) (А в моем это OpenSUSE 10.3 - прим. перев. :). Создав "виртуальную" среду питона, мы сможем избежать множества различных проблем, связанных с системным питоном, таких как: неработающие пакеты, конфликтующие зависимости и т.д.).

Виртуальную среду питона можно легко создать с помощью скрипта virtualenv.py, доступного по адресу: http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py. Подробнее о том, что делает этот скрипт, можно почитать на странице pypi: http://pypi.python.org/pypi/virtualenv.
Загрузите этот скрипт в вашу домашнюю директорию и создайте новое окружение с именем sandbox:
$ wget http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py ~/
$ python ~/virtualenv.py sandbox

В качестве альтернативы вы можете поместить эту среду в любое место, куда вам захочется, и назвать так, как вам нравится! Эта папка сейчас имеет директорию bin с новым исполняемым файлом python и скриптом easy_install. Еще там лежит bash-скрипт для помещения вашей оболочки в новую среду, так что вы не должны набирать полный путь для запуска питона из нашего окружения. Давайте-ка запустим это:

$ cd sandbox
$ source bin/activate

После этого мы можем убедиться в том, что это все работает:

(sandbox)$ which python
/home/pcardune/sandbox/bin/python

Начиная с этого момента, везде, где вы увидите запущенную shell-команду, подразумевается, что вы запустили виртуальное окружение.

2.2 Использование zopeproject

Было бы неплохо начать работу с простейшего каркаса приложения, так чтобы не нужно было беспокоиться о написании всей конфигурации с нуля. К счастью, для этого Philipp von Weitershausen уже написал замечательное средстов, названное zopeproject

zopeproject можно установить с помощью скрипта easy_install. Для этого просто наберите:

$ easy_install zopeproject

Теперь создадим новый проект под названием zcontact. zopeproject создаст всю основную конфигурацию, которая вам понадобится для того, чтобы запустить пустое zope-приложение и войти под аккаунтом администратора. Вас попросят ввести имя и пароль к административному аккаунту (который можно будет изменить в любое время), а также расположение для установки необходимых компонентов.

$ 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

Этот шаг может занять несколько

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

2.3 Запуск сервера

Когда все будет завершено вы можете зайти прямо туда (а можно попрыгать сначала и поплясать драмак - прим. перев. :) и запустить ваше зарождающееся приложение, которое по умолчанию запустится на 8080 порту:

$ cd zcontact
$ ./bin/paster serve deploy.ini

Starting server in PID 23818.
serving on http://127.0.0.1:8080

Сейчас вы должны получить пустой zope-экран, который выглядит примерно так:

images/screen1.png

Файл deploy.ini, передаваемый команде ./bin/paster, указывает опции для запускаемого сервера, например, такие как настройки порта. zopeproject также генерирует файл debug.ini, который включает WSGI-фильтр для управления ошибками. Даже когда вы запустились с ошибками, вы можете использовать конфигурацию debug.ini для отслеживания кода, как он запускается, прямо в вашем браузере!

2.4 Регулировка настроек безопасности

Чтобы упростить себе работу в этом руководстве, мы настроим права, генерируемые zopeproject'ом, так, чтобы нам не пришлось заботиться о них в дальнейшем. Добавим следующие строчки в файл site.zcml, который находится в корневой директории вашего приложения:





Это даст полный доступ ко всему без ограничений анонимным пользователям.

2.5 Создание простого интерфейса и реализации

Перед тем как окунуться в мир пакетов z3c.*, мы должны иметь некий объект, с которым мы будем играться. Поскольку ZContact'у полагается быть менеджером контактов, давайте начнем с объекта контакт. Чтобы он был попроще, у нас будет всего два поля: имя и фамилия (first name и last name).

Примечание

Весь исходный код располагается в папке zcontact/src/zcontact, так что zcontact/src/zcontact/interfaces.py можно импортировать как import zcontact.interfaces.

2.5.1. Интерфейс IContact

Откройте файл interfaces.py и добавьте следующее:
1
2
3
4
5
6
7
8
9
10
11
12
13
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)
2.5.2 Реализация Contact

Теперь по-быстренькому мы можем сделать нашу реализацию. Откройте contact.py и добавьте следующее:
1
2
3
4
5
6
7
8
9
10
11
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'])
2.5.3 Регистрация безопасности для класса Contact

Еще нам нужно зарегистрировать класс Contact в zcml и настроить права для доступа к атрибутам. Просто добивим следующее в файл src/zcontact/configure.zcml

Когда все это проделано, мы можем окунуться в виды, которые используют компоненты z3c.*!

Внимание!

Не забудьте, в реальном мире вам сначала следовало бы написать unit-тесты для этого кода, чтобы убедиться в том, что класс Contact действительно реализует интерфейс IContact!

Комментариев нет: