Различия между версиями 4 и 43 (по 39 версиям)
Версия 4 от 2010-07-01 12:51:19
Размер: 3864
Редактор: RostislavDzinko
Комментарий:
Версия 43 от 2010-07-05 09:30:22
Размер: 30230
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 3: Строка 3:
{{{#!wiki caution

  Эта страница еще редактируется

}}}
Строка 7: Строка 13:
== Что такое BlueBream == == Что такое BlueBream? ==
Строка 15: Строка 21:
A few features distinguish BlueBream from other Python web frameworks.

BlueBream is built on top of the Zope Tool Kit (ZTK), which has many years of experience proving it meets the demanding requirements for stable, scalable software.
BlueBream uses the powerful and familiar Buildout system written in Python.
BlueBream employs the Zope Object Database (ZODB), a transactional object database providing extremely powerful and easy to use persistence.
BlueBream registers components with Zope Component Markup Language (ZCML), an XML based configuration language, providing limitless flexibility.
BlueBream can also register components using GROK, which adds a layer replacing the declarative configuration of ZCML with conventions and declarations in standard Python.
BlueBream features the Zope Component Architecture (ZCA) which implements Separation of concerns to create highly cohesive reusable components (zope.component).
BlueBream implements Python Web Server Gateway Interface WSGI using Paste, PasteScript, and PasteDeploy.
BlueBream includes a number of well tested components to implement common activities. A few are of these are:
zope.publisher publishes Python objects on the web, emphasizing WSGI compatibility
zope.security provides a generic mechanism for pluggable security policies
zope.testing and zope.testbrowser offer unit and functional testing frameworks
zope.pagetemplate is an XHTML-compliant language for devloping templates
zope.schema is a schema engine
zope.formlib is a tool for automatically generating forms
BlueBream is free/open source software, owned by the Zope Foundation. Bluebream is licensed under the Zope Public License (BSD like, GPL compatible license).
Вот несколько особенностей, которые отличают !BlueBream от других веб фреймворков языка Python:

 * !BlueBream построен на базе Zope Tool Kit (ZTK), который разрабатывался много лет и доказал свою надежность и соответствие потребностям к разработки стабильного, масштабируемого программного обеспечения.
 * !BlueBream использует мощную и известную систему сборки Buildout, созданную на языке Python.
 * !BlueBream использует Zope Object Database (ZODB) - транзакционную объектную базу данных, которая обеспечивает мощный и простой в использовании механизм долгосрочного хранения.
 * !BlueBream регистрирует компоненты с помощью Zope Component Markup Language (ZCML) - языка конфигураций, основанном на XML, который обеспечивает безграничную гибкость.
 * !BlueBream может также регистрировать компоненты используя GROK, который добавляет новый слой конфигурации, замещая декларативную конфигурацию ZCML конвенциями и объявлениями в стандартах Python.
 * !BlueBream обладает Zope Component Architecture (ZCA), которая реализует разделение задач для создания высоко-связуемых компонентов повторного использования (''zope.component'').
 * !BlueBream реализует Python Web Server Gateway Interface WSGI путем использования Paste, !PasteScript, и !PasteDeploy.
 * !BlueBream включает множество хорошо оттестированных компонентов, которые реализуют общие задачи. Вот несколько из них:
    * ''zope.publisher'' публикует объекты Python в веб окружении, поддерживая совместимость с WSGI
    * ''zope.security'' предоставляет общий механизм подключаемых политик безопасности policies
    * ''zope.testing'' и ''zope.testbrowser'' предлагают фреймворки для unit- и функционального тестирования
    * ''zope.pagetemplate'' - XHTML-совместимый язык разработки шаблонов
    * ''zope.schema'' - механизм схем
    * ''zope.formlib'' - инструмент для автоматической генерации форм

!BlueBream - свободное/с открытым исходным кодом программное обеспечение, является собственностью Zope Foundation. !Bluebream выпускается под лицензией Zope Public License (BSD-подобная, GPL-совместимая лицензия).

== Что такое Zope Foundation? ==

Из http://foundation.zope.org:

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

Zope Foundation владеет авторскими правами на программное обеспечение Zope,
множества расширений и связанного программного обеспечения.
Zope Foundation также управляет сайтом ''zope.org'' и инфраструктурой
сотрудничества.
}}}

Для более подробной информации обратитесь к: http://foundation.zope.org/about

== Как Я могу помочь? ==

Если вы заинтересованы в оказании помощи сообществу, у вам есть время, - обучитесь компонентной архитектуре и !BlueBream, и принимайте участие в любой из областей разработки. Посещайте на IRC канал: '''#bluebream at irc.freenode.net'''. Также присоединяйтесь к спискам рассылки: https://mail.zope.org/mailman/listinfo/bluebream. Вот вики страница с более подробной информацией: http://wiki.zope.org/bluebream/ContributingToBlueBream.

== Под какой лицензией выпускается BlueBream? ==

!BlueBream выпускается под лицензией [[http://bluebream.zope.org/doc/1.0/glossary.html#term-zope-public-license|Zope Public License]] (BSD-подобная, GPL-совместимая лицензия).

== Стабилен ли BlueBream достаточно для того, чтобы использовать на производственных серверах ==

Да, он достаточно стабилен для использования в производственном (production) окружении. !BlueBream (раньше Zope 3) уже используется в ряде больших проектов. Разработка !BlueBream, наверное, никогда не закончится, по крайней мере, пока он соответствует нашим требованиям :)

== Какая версия Python необходима для работы BlueBream? ==

!BlueBream 1.0 поддерживает следующие версии языка Python:

 * Python 2.4
 * Python 2.5
 * Python 2.6

Если вы используете 64-битную платформу, рекомендуется использовать Python 2.6.

== Что такое KGS (Known Good Set)? ==

Начиная с версии Zope 3.4, Zope 3 (!BlueBream) разделен на маленькие пакеты, называемые "яйцами", которые выпускаются независимо друг от друга. KGS - набор таких яиц, которые известны как хорошо работающие вместе. Их список можно найти в версионном файле Buildout.

Индекс пакета KGS для zope 3.4: http://download.zope.org/zope3.4/
Новые версии файла будут доступны здесь: http://download.zope.org/bluebream/

== Как мне создать новый BlueBream проект? ==

Обратитесь к разделу документации [[http://wiki.python.su/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8/Bluebream/Bluebream-%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B5-%D0%A8%D0%B0%D0%B3%D0%B8|Первые шаги]].

= Концепции =

== Что такое компонентная архитектура ==

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

== Где я могу найти ссылки на ресурсы? ==

 * [[http://bluebream.zope.org/|Официальный сайт]] (обновляется один раз в день)
 * [[http://bluebream.muthukadan.net/|Зеркало]] (Обновляется раз в 30 минут)
 * [[http://pypi.python.org/pypi/bluebream|Страница PyPI]]
 * [[https://mail.zope.org/mailman/listinfo/bluebream|Списки рассылки]]
 * [[http://twitter.com/bluebream|Twitter]]
 * [[http://bluebream.posterous.com/|Блог]]
 * IRC Канал: [[http://webchat.freenode.net/?randomnick=1&channels=bluebream|#bluebream на freenode.net]]
 * Ohloh.net: https://www.ohloh.net/p/bluebream
 * Buildbots: http://buildbot.afpy.org/bluebream/ http://bluebream.buildbot.securactive.org/
 * Вики страницы сообщества

== Что такое /@@ и какой его синтаксис? ==

'''@@''' - сокращенная форма записи для '''++view++'''. (Мнемонически, это выглядит как пара глаз)

Для того, чтобы указать, что вы хотите получить вид с именем '''bar''' контент-объекта '''foo''', вам необходимо (в компактной форме) перейти по ссылке '''.../foo/@@bar''' вместо '''.../foo/++view++bar'''.

Заметьте также, что даже '''@@''' не нужен, если контейнер '''foo''' не содержит элемента с именем '''bar''' - он служит только для того, чтобы различать виды и содержимое контейнера.

'''@@''' также используется для статических ресурсов. Для получения доступа к зарегистрированному статическому ресурсу с именем '''logo.png''', вы можете использовать '''/@@/logo.png''', или его эквивалент '''/++resource++logo.png'''. '''logo.png''' - это регистрационное имя файла, при этом физическое имя файла может быть совсем другим.

То же самое касается и папки ресурсов с именем '''images''': '''/@@/images/logo.png''' эквивалентно '''/++resource++images/logo.png'''. В этом случае, '''logo.png''' - реальное имя файла, размещенного в зарегистрированной папке с ресурсами.

= Безопасность =

== Как настроить несколько классов с одинаковыми правами доступа? ==

Ссылка: http://mail.zope.org/pipermail/zope3-users/2007-June/006291.html

Используйте атрибут '''like_class''' тега required, ниже несколько примеров:

{{{#!highlight xml
<class class=".MyImage">
  <implements interface=".interfaces.IGalleryItemContained" />
  <require like_class="zope.app.file.interfaces.IImage />
</class>

<class class=".MySite">
  <require like_class="zope.app.folder.Folder" />
</class>
}}}

== Как в коде определить, имеет ли пользователь нужные права? ==

Ссылка: http://mail.zope.org/pipermail/zope3-users/2006-August/004201.html

Вопрос: как мне узнать, имеет ли текущий пользователь права на некий вид?
Вот примерное решение:

{{{#!highlight python
def canEdit(self):
    ppal = self.request.principal
    return canView('edit', INewsItem, ppal)
}}}

Используйте '''zope.security.canAccess''' и/или '''zope.security.canWrite'''.

Для определения других прав на объект, можно сделать примерно следующее:

{{{#!highlight python
from zope.security.management import checkPermission
has_permission = checkPermission('zope.ModifyContent', self.context)
}}}

== Я зарегистрировал PAU в корне сайта, и теперь не могу войти как zope.Manager. Что мне делать? ==

Запустите отладочную оболочку и снимите регистрацию с утилиты. Это позволит вам войти в сайт с правами, которые определены в '''securitypolicy.zcml'''.

Пример:

{{{#!highlight python
$ ./bin/paster shell debug.ini
...
>>> import transaction
>>> from zope.component import getSiteManager
>>> from zope.app.security.interfaces import IAuthentication
>>> lsm = getSiteManager(root)
>>> lsm.unregisterUtility(lsm.getUtility(IAuthentication), IAuthentication)
>>> transaction.commit()
}}}

Когда вы выйдете из отладки и запустите сервер, то получите возможность войти на сайт как пользователь, который определен в '''principals.zcml'''. Он должен иметь право '''zope.Manager'''.

Во избежание таких ситуаций, либо предоставьте роль менеджера пользователю, который определен в PAU, либо создайте папку глубже корневой, сделайте ее сайтом, и зарегистрируйте PAU в ней. Тогда вы по прежнему сможете входить в корень сайта и иметь полные права.

== Как мне настроить аутентификацию (используя PAU)? ==

{{{#!highlight python
site = getSite()
sm = site.getSiteManager()
pau = PluggableAuthentication()
sm['authentication'] = pau
sm.registerUtility(pau, IAuthentication)
users = PrincipalFolder()
sm['authentication']['Users'] = users
sm.registerUtility(users, IAuthenticatorPlugin, name="Users")
pau.authenticatorPlugins = (users.__name__, )
pau.credentialsPlugins = ( "No Challenge if Authenticated", "Session Credentials" )
}}}

== Как мне выйти из BlueBream? ==

FIXME: Это правильно ?

Выход доступен со времен Zope 3.3, но по умолчанию он отключен. Для включения - добавьте следующую строчку в '''etc/site.zcml''':

{{{#!highlight xml
<adapter factory="zope.app.security.LogoutSupported" />
}}}

== Почему я получаю ошибку адаптации ILoginPassword при использовании login.html? ==

Ссылка: https://mail.zope.org/pipermail/zope3-users/2010-January/008745.html

Вопрос: Я получаю такую ошибку, когда пытаюсь зайти на вид '''login.html'''.
{{{
.../eggs/zope.principalregistry-3.7.0-py2.5.egg/zope/principalregistry/principalregistry.py",
line 82, in unauthorized
   a = ILoginPassword(request)
TypeError: ('Could not adapt', <zope.publisher.browser.BrowserRequest
instance URL=http://localhost:9060/@@login.html>, <InterfaceClass
zope.authentication.interfaces.ILoginPassword>)
}}}

Вам следует включить пакет ''zope.login'' в ZCML конфигурацию ('''site.zcml'''), так как регистрация адаптера производится именно там:

{{{#!highlightp xml
<include package="zope.login" />
}}}

= Пользовательский интерфейс =

== Как установить z3c.traverser и zope.contentprovider? ==

''z3c.traverser'' и ''zope.contentprovider'' - вспомогательные пакеты с хорошими и чистыми док. тестами. Для их установки и запуска не нужно много времени, но эти пакеты не содержат примера конфигурации при добавлении их в проект. Из док. тестов становится ясным (и из ваших собственных, написанных во время тестирования собственного кода), что нужно настроить. Итак, для ''z3c.traverser'':

{{{#!highlight xml
<!-- register traverser for app -->
<view
  for=".IMallApplication"
  type="zope.publisher.interfaces.browser.IBrowserRequest"
  provides="zope.publisher.interfaces.browser.IBrowserPublisher"
  factory="z3c.traverser.browser.PluggableBrowserTraverser"
  permission="zope.Public"
  />

<!-- register traverser plugins -->
<!-- my own plugin -->
<subscriber
  for=".IMallApplication
       zope.publisher.interfaces.browser.IBrowserRequest"
  provides="z3c.traverser.interfaces.ITraverserPlugin"
  factory=".traverser.MallTraverserPlugin"
/>
<!-- and traverser package container traverser -->
<subscriber
  for=".IMallApplication
       zope.publisher.interfaces.browser.IBrowserRequest"
  provides="z3c.traverser.interfaces.ITraverserPlugin"
  factory="z3c.traverser.traverser.ContainerTraverserPlugin"
/>
}}}

И для ''zope.contentprovider'':

{{{#!highlight xml
<!-- register named adapter for menu provider -->
<adapter
  provides="zope.contentprovider.interfaces.IContentProvider"
  factory="tfws.menu.provider.MenuProvider"
  name="tfws.menu"
  />

<!-- this does the directlyProvides -->
<interface
  interface="tfws.menu.provider.IMenu"
  type="zope.contentprovider.interfaces.ITALNamespaceData"
  />
}}}

== Как объявить глобальные константы в ZCML? ==

Ссылка: http://mail.zope.org/pipermail/zope3-users/2006-September/004381.html

Можно просто использовать директиву '''<utility>''', и сгруппировать константы в логические участки.

__interfaces.py:__

{{{#!highlight python
class IDatabaseLoginOptions(Interface):
     username = Attribute()
     password = Attribute()
}}}

__config.py:__

{{{#!highlight python
class DatabaseLoginOptions(object):
     implements(IDatabaseLoginOptions)
     username = 'foo'
     password = 'bar'
}}}

__configure.zcml:__

{{{#!highlight python
<utility factory=".config.DatabaseLoginOptions" />
}}}

__использование:__

{{{#!highlight python
opts = getUtility(IDatabaseLoginOptions)
}}}

Очевидно, что нужно проделать немного больше работы, нежели просто задекларировать несколько констант в ZCML, но глобальные константы вносят много проблем, неважно, определены они в Python, или в XML. Части вашего приложения предполагают их наличие с очень специфическими именами, а их типы нельзя проверить.

== Как установить скин по умолчанию? ==

Используйте директиву '''browser:defaultSkin''':

{{{#!highlight xml
<browser:defaultSkin name="skinname" />
}}}

Для получения более подробной информации о скинах, обратитесь к [[http://bluebream.zope.org/doc/1.0/manual/skinning.html#man-browser-skinning|документации]].

== Как зарегистрировать контент провайдер без использования менеджера вьюлетов? ==

Вам нужно создать и зарегистрировать простой адаптер для объекта, запроса и вида, который реализует интерфейс '''IContentProvider''':

{{{#!highlight python
class LatestNews(object):

    implements(IContentProvider)
    adapts(Interface, IDefaultBrowserLayer, Interface)

    def __init__(self, context, request, view):
        self.context = context
        self.request = request
        self.__parent__ = view

    def update(self):
        pass

    def render(self):
        return 'Latest news'
}}}

В ZCML:

{{{#!highlight xml
<adapter name="latestNews"
         for="* zope.publisher.interfaces.browser.IDefaultBrowserLayer *"
         provides="zope.contentprovider.interfaces.IContentProvider"
         factory=".LatestNews" />
}}}

Тогда их можно использовать в TAL шаблонах следующим образом:

{{{#!highlight xml
<div tal:content="provider latestNews" />
}}}

Также, вы, возможно, захотите передать через TAL некие параметры. Для получения информации о том, как это сделать, читайте документацию в ''zope.contentprovider''. Если вы хотите привязать некий контент провайдер к скину, измените '''IDefaultBrowserLayer''' на ваш интерфейс скина.

== Как подключить статическое содержимое? ==

Взгляните на директивы '''<resource>''' и '''<resourceDirectory>''' - они позволяют публиковать статические файлы посредством Zope. Обратитесь к [[http://bluebream.zope.org/doc/1.0/manual/browserresource.html#man-browser-resource|документации по ресурсам браузера]] для получения более полной информации.

== Доступны ли исходики сервера Webdav в !BlueBream? ==

Ссылка: http://mail.zope.org/pipermail/zope3-users/2006-September/004648.html

Да, вот ссылка на репозиторий: http://svn.zope.org/zope.webdav/trunk

== Как использовать переопределения в сборщике в site.zcml для рецепта zc.zope3recipes:app? ==

Ссылка: http://mail.zope.org/pipermail/zope3-users/2007-April/006106.html

{{{highlight xml
<includeOverrides package="myapp" file="overrides.zcml" />
}}}

== Как сделать свой траверсинг в !BlueBream? ==

Обратитесь к этому блогу: http://mg.pov.lt/blog/zope3-custom-traversal.html

= Программирование =

== Доступна ли документация по API онлайн? ==

Инфраструктура документации Zope3 обладает возможностью генерации html содержимого на лету. Это делает ее немножко медленной при просмотре на старых машинах.

Закешированный вариант документации (а поэтому быстрый) доступен на: http://apidoc.zope.org/++apidoc++/

== Как вытянуть проект/пакет из SVN-репозитория? ==

Взгляните сюда: http://docs.zope.org/developer/noncommitter-svn.html

== Как сделать апгрейд с более старого релиза? ==

Обновите ''versions.cfg'' и укажите URL версионного файла !BlueBream нового релиза и запустите сборщик.

== Нужно ли мне каждый раз перезагружать сервер при изменении файлов кода? ==

Нет, не нужно, если ві пользуетесь опцией '''--reload''' команды '''paster serve'''. То есть, запускать сервер следует так:

{{{#!highlight bash
./bin/paster serve --reload debug.ini
}}}

{{{#!wiki note
Мы рекомендуем писать автоматизированные тесты для просмотра эффекта, который произвели изменения. Вначале это кажется надоедливым, но, войдя в привычку, становится неотъемлимой и полезной частью процесса разработки.
}}}

== Как автоматически создавать нужный объект при старте приложения? ==

http://mail.zope.org/pipermail/zope-dev/2007-December/030562.html

Вы можете сделать это подписываясь на событие '''IDatabaseOpenedWithRootEvent (из zope.app.appsetup)'''

Пример кода:

{{{#!highlight python
from zope.app.appsetup.interfaces import IDatabaseOpenedWithRootEvent
from zope.app.appsetup.bootstrap import getInformationFromEvent
import transaction

@adapter(IDatabaseOpenedWithRootEvent)
def create_my_container(event):
    db, connection, root, root_folder = getInformationFromEvent(event)
    if 'mycontainer' not in root_folder:
        root_folder['mycontainer'] = MyContainer()
    transaction.commit()
    connection.close()
}}}

Потом зарегистрируйте подписчик в ''configure.zcml'':

{{{#!highlight xml
<subscriber handler="myapp.create_my_container" />
}}}

== Как сделать валидацию двух или более полей одновременно? ==

Представьте себе простой пример: есть объект '''личность'''. Этот объект имеет атрибуты '''name''', '''email''' и '''phone'''. Как реализовать правило валидации, которое определяет, существует ли '''email''' или '''phone''', но необязательно оба.

Сначала сделаем вызываемый объект - либо простую функцию, либо вызываемый класс:

{{{#!highlight python
>>> def contacts_invariant(obj):
... if not (obj.email or obj.phone):
... raise Exception("At least one contact info is required")
}}}

Теперь, определим интерфейс объекта следующим образом. Используйте функцию '''interface.invariant''' для установки инварианта:

{{{#!highlight python
>>> class IPerson(interface.Interface):
...
... name = interface.Attribute("Name")
... email = interface.Attribute("Email Address")
... phone = interface.Attribute("Phone Number")
...
... interface.invariant(contacts_invariant)
}}}

Теперь используйте метод '''validateInvariants''' для валидации:

{{{#!highlight python
>>> class Person(object):
... interface.implements(IPerson)
...
... name = None
... email = None
... phone = None
>>> jack = Person()
>>> jack.email = u"jack@some.address.com"
>>> IPerson.validateInvariants(jack)
>>> jill = Person()
>>> IPerson.validateInvariants(jill)
Traceback (most recent call last):
...
Exception: At least one contact info is required
}}}

== Как получить родителя location? ==

Для того, чтобы получить родителя объекта используйте '''zope.traversing.api.getParent(obj)'''. Для получения списка родительских объектов - используйте '''zope.traversing.api.getParents(obj)'''.

== Как установить заголовок Content-Type HTTP-запроса? ==

Из IRC (http://zope3.pov.lt/irclogs/%23zope3-dev.2006-06-20.log.html):

{{{
Is there any way using the browser:page directive, that I can
specify that the Type of a page rendered is not "text/html" but
rather "application/vnd.mozilla.xul+xml"?
}}}

Используйте '''request.response.setHeader(‘content-type’, ...)'''

Часто задаваемые вопросы

  • Эта страница еще редактируется

Содержание

  1. Общее
    1. Что такое BlueBream?
    2. Почему BlueBream?
    3. Что такое Zope Foundation?
    4. Как Я могу помочь?
    5. Под какой лицензией выпускается BlueBream?
    6. Стабилен ли BlueBream достаточно для того, чтобы использовать на производственных серверах
    7. Какая версия Python необходима для работы BlueBream?
    8. Что такое KGS (Known Good Set)?
    9. Как мне создать новый BlueBream проект?
  2. Концепции
    1. Что такое компонентная архитектура
    2. Где я могу найти ссылки на ресурсы?
    3. Что такое /@@ и какой его синтаксис?
  3. Безопасность
    1. Как настроить несколько классов с одинаковыми правами доступа?
    2. Как в коде определить, имеет ли пользователь нужные права?
    3. Я зарегистрировал PAU в корне сайта, и теперь не могу войти как zope.Manager. Что мне делать?
    4. Как мне настроить аутентификацию (используя PAU)?
    5. Как мне выйти из BlueBream?
    6. Почему я получаю ошибку адаптации ILoginPassword при использовании login.html?
  4. Пользовательский интерфейс
    1. Как установить z3c.traverser и zope.contentprovider?
    2. Как объявить глобальные константы в ZCML?
    3. Как установить скин по умолчанию?
    4. Как зарегистрировать контент провайдер без использования менеджера вьюлетов?
    5. Как подключить статическое содержимое?
    6. Доступны ли исходики сервера Webdav в !BlueBream?
    7. Как использовать переопределения в сборщике в site.zcml для рецепта zc.zope3recipes:app?
    8. Как сделать свой траверсинг в !BlueBream?
  5. Программирование
    1. Доступна ли документация по API онлайн?
    2. Как вытянуть проект/пакет из SVN-репозитория?
    3. Как сделать апгрейд с более старого релиза?
    4. Нужно ли мне каждый раз перезагружать сервер при изменении файлов кода?
    5. Как автоматически создавать нужный объект при старте приложения?
    6. Как сделать валидацию двух или более полей одновременно?
    7. Как получить родителя location?
    8. Как установить заголовок Content-Type HTTP-запроса?

Общее

Что такое BlueBream?

BlueBream - готовый к использованию свободный/с открытым исходным кодом фреймворк для создания веб приложений, написанный на языке программирования Python. BlueBream предоставляет компонентную архитектуру, транзакционную объектную базу данных, хорошо интегрированную модель безопасности и много других возможностей.

BlueBream берет свое начало из сообщества Zope, созданного в 1998 году. Изначально основополагающие технологии Zope были разработаны в Zope Corporation. Разработка BlueBream началась в конце 2001 года. В ноябре 2004 года была выпущена первая версия. BlueBream - полностью переписанный вариант, который сохраняет только объектную базу данных ZODB. Архитектура BlueBream порождена потребностями больших компаний, и нацелена на создание корпоративных (enterprise) веб приложений с использованием новейших парадигм в разработке программного обеспечения. На проект очень сильно повлияла концепция экстремального программирования, поэтому для ускорения процесса разработки BlueBream проводятся спринты. В 2006 году был создан фонд Zope, целью которого стала помощь в организации и создании связей с сообществом Zope.

Почему BlueBream?

Вот несколько особенностей, которые отличают BlueBream от других веб фреймворков языка Python:

  • BlueBream построен на базе Zope Tool Kit (ZTK), который разрабатывался много лет и доказал свою надежность и соответствие потребностям к разработки стабильного, масштабируемого программного обеспечения.

  • BlueBream использует мощную и известную систему сборки Buildout, созданную на языке Python.

  • BlueBream использует Zope Object Database (ZODB) - транзакционную объектную базу данных, которая обеспечивает мощный и простой в использовании механизм долгосрочного хранения.

  • BlueBream регистрирует компоненты с помощью Zope Component Markup Language (ZCML) - языка конфигураций, основанном на XML, который обеспечивает безграничную гибкость.

  • BlueBream может также регистрировать компоненты используя GROK, который добавляет новый слой конфигурации, замещая декларативную конфигурацию ZCML конвенциями и объявлениями в стандартах Python.

  • BlueBream обладает Zope Component Architecture (ZCA), которая реализует разделение задач для создания высоко-связуемых компонентов повторного использования (zope.component).

  • BlueBream реализует Python Web Server Gateway Interface WSGI путем использования Paste, PasteScript, и PasteDeploy.

  • BlueBream включает множество хорошо оттестированных компонентов, которые реализуют общие задачи. Вот несколько из них:

    • zope.publisher публикует объекты Python в веб окружении, поддерживая совместимость с WSGI

    • zope.security предоставляет общий механизм подключаемых политик безопасности policies

    • zope.testing и zope.testbrowser предлагают фреймворки для unit- и функционального тестирования

    • zope.pagetemplate - XHTML-совместимый язык разработки шаблонов

    • zope.schema - механизм схем

    • zope.formlib - инструмент для автоматической генерации форм

BlueBream - свободное/с открытым исходным кодом программное обеспечение, является собственностью Zope Foundation. !Bluebream выпускается под лицензией Zope Public License (BSD-подобная, GPL-совместимая лицензия).

Что такое Zope Foundation?

Из http://foundation.zope.org:

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

Zope Foundation владеет авторскими правами на программное обеспечение Zope,
множества расширений и связанного программного обеспечения.  
Zope Foundation также управляет сайтом ''zope.org'' и инфраструктурой
сотрудничества.

Для более подробной информации обратитесь к: http://foundation.zope.org/about

Как Я могу помочь?

Если вы заинтересованы в оказании помощи сообществу, у вам есть время, - обучитесь компонентной архитектуре и BlueBream, и принимайте участие в любой из областей разработки. Посещайте на IRC канал: #bluebream at irc.freenode.net. Также присоединяйтесь к спискам рассылки: https://mail.zope.org/mailman/listinfo/bluebream. Вот вики страница с более подробной информацией: http://wiki.zope.org/bluebream/ContributingToBlueBream.

Под какой лицензией выпускается BlueBream?

BlueBream выпускается под лицензией Zope Public License (BSD-подобная, GPL-совместимая лицензия).

Стабилен ли BlueBream достаточно для того, чтобы использовать на производственных серверах

Да, он достаточно стабилен для использования в производственном (production) окружении. BlueBream (раньше Zope 3) уже используется в ряде больших проектов. Разработка BlueBream, наверное, никогда не закончится, по крайней мере, пока он соответствует нашим требованиям :)

Какая версия Python необходима для работы BlueBream?

BlueBream 1.0 поддерживает следующие версии языка Python:

  • Python 2.4
  • Python 2.5
  • Python 2.6

Если вы используете 64-битную платформу, рекомендуется использовать Python 2.6.

Что такое KGS (Known Good Set)?

Начиная с версии Zope 3.4, Zope 3 (BlueBream) разделен на маленькие пакеты, называемые "яйцами", которые выпускаются независимо друг от друга. KGS - набор таких яиц, которые известны как хорошо работающие вместе. Их список можно найти в версионном файле Buildout.

Индекс пакета KGS для zope 3.4: http://download.zope.org/zope3.4/ Новые версии файла будут доступны здесь: http://download.zope.org/bluebream/

Как мне создать новый BlueBream проект?

Обратитесь к разделу документации Первые шаги.

Концепции

Что такое компонентная архитектура

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

Где я могу найти ссылки на ресурсы?

Что такое /@@ и какой его синтаксис?

@@ - сокращенная форма записи для ++view++. (Мнемонически, это выглядит как пара глаз)

Для того, чтобы указать, что вы хотите получить вид с именем bar контент-объекта foo, вам необходимо (в компактной форме) перейти по ссылке .../foo/@@bar вместо .../foo/++view++bar.

Заметьте также, что даже @@ не нужен, если контейнер foo не содержит элемента с именем bar - он служит только для того, чтобы различать виды и содержимое контейнера.

@@ также используется для статических ресурсов. Для получения доступа к зарегистрированному статическому ресурсу с именем logo.png, вы можете использовать /@@/logo.png, или его эквивалент /++resource++logo.png. logo.png - это регистрационное имя файла, при этом физическое имя файла может быть совсем другим.

То же самое касается и папки ресурсов с именем images: /@@/images/logo.png эквивалентно /++resource++images/logo.png. В этом случае, logo.png - реальное имя файла, размещенного в зарегистрированной папке с ресурсами.

Безопасность

Как настроить несколько классов с одинаковыми правами доступа?

Ссылка: http://mail.zope.org/pipermail/zope3-users/2007-June/006291.html

Используйте атрибут like_class тега required, ниже несколько примеров:

   1 <class class=".MyImage">
   2   <implements interface=".interfaces.IGalleryItemContained" />
   3   <require like_class="zope.app.file.interfaces.IImage />
   4 </class>
   5 
   6 <class class=".MySite">
   7   <require like_class="zope.app.folder.Folder" />
   8 </class>

Как в коде определить, имеет ли пользователь нужные права?

Ссылка: http://mail.zope.org/pipermail/zope3-users/2006-August/004201.html

Вопрос: как мне узнать, имеет ли текущий пользователь права на некий вид? Вот примерное решение:

   1 def canEdit(self):
   2     ppal = self.request.principal
   3     return canView('edit', INewsItem, ppal)

Используйте zope.security.canAccess и/или zope.security.canWrite.

Для определения других прав на объект, можно сделать примерно следующее:

   1 from zope.security.management import checkPermission
   2 has_permission = checkPermission('zope.ModifyContent', self.context)

Я зарегистрировал PAU в корне сайта, и теперь не могу войти как zope.Manager. Что мне делать?

Запустите отладочную оболочку и снимите регистрацию с утилиты. Это позволит вам войти в сайт с правами, которые определены в securitypolicy.zcml.

Пример:

   1 $ ./bin/paster shell debug.ini
   2 ...
   3 >>> import transaction
   4 >>> from zope.component import getSiteManager
   5 >>> from zope.app.security.interfaces import IAuthentication
   6 >>> lsm = getSiteManager(root)
   7 >>> lsm.unregisterUtility(lsm.getUtility(IAuthentication), IAuthentication)
   8 >>> transaction.commit()

Когда вы выйдете из отладки и запустите сервер, то получите возможность войти на сайт как пользователь, который определен в principals.zcml. Он должен иметь право zope.Manager.

Во избежание таких ситуаций, либо предоставьте роль менеджера пользователю, который определен в PAU, либо создайте папку глубже корневой, сделайте ее сайтом, и зарегистрируйте PAU в ней. Тогда вы по прежнему сможете входить в корень сайта и иметь полные права.

Как мне настроить аутентификацию (используя PAU)?

   1 site = getSite()
   2 sm = site.getSiteManager()
   3 pau = PluggableAuthentication()
   4 sm['authentication'] = pau
   5 sm.registerUtility(pau, IAuthentication)
   6 users = PrincipalFolder()
   7 sm['authentication']['Users'] = users
   8 sm.registerUtility(users, IAuthenticatorPlugin, name="Users")
   9 pau.authenticatorPlugins = (users.__name__, )
  10 pau.credentialsPlugins = ( "No Challenge if Authenticated", "Session Credentials" )

Как мне выйти из BlueBream?

FIXME: Это правильно ?

Выход доступен со времен Zope 3.3, но по умолчанию он отключен. Для включения - добавьте следующую строчку в etc/site.zcml:

   1 <adapter factory="zope.app.security.LogoutSupported" />

Почему я получаю ошибку адаптации ILoginPassword при использовании login.html?

Ссылка: https://mail.zope.org/pipermail/zope3-users/2010-January/008745.html

Вопрос: Я получаю такую ошибку, когда пытаюсь зайти на вид login.html.

.../eggs/zope.principalregistry-3.7.0-py2.5.egg/zope/principalregistry/principalregistry.py",
line 82, in unauthorized
   a = ILoginPassword(request)
TypeError: ('Could not adapt', <zope.publisher.browser.BrowserRequest
instance URL=http://localhost:9060/@@login.html>, <InterfaceClass
zope.authentication.interfaces.ILoginPassword>)

Вам следует включить пакет zope.login в ZCML конфигурацию (site.zcml), так как регистрация адаптера производится именно там:

<include package="zope.login" />

Пользовательский интерфейс

Как установить z3c.traverser и zope.contentprovider?

z3c.traverser и zope.contentprovider - вспомогательные пакеты с хорошими и чистыми док. тестами. Для их установки и запуска не нужно много времени, но эти пакеты не содержат примера конфигурации при добавлении их в проект. Из док. тестов становится ясным (и из ваших собственных, написанных во время тестирования собственного кода), что нужно настроить. Итак, для z3c.traverser:

   1 <!-- register traverser for app -->
   2 <view
   3   for=".IMallApplication"
   4   type="zope.publisher.interfaces.browser.IBrowserRequest"
   5   provides="zope.publisher.interfaces.browser.IBrowserPublisher"
   6   factory="z3c.traverser.browser.PluggableBrowserTraverser"
   7   permission="zope.Public"
   8   />
   9 
  10 <!-- register traverser plugins -->
  11 <!-- my own plugin -->
  12 <subscriber
  13   for=".IMallApplication
  14        zope.publisher.interfaces.browser.IBrowserRequest"
  15   provides="z3c.traverser.interfaces.ITraverserPlugin"
  16   factory=".traverser.MallTraverserPlugin"
  17 />
  18 <!-- and traverser package container traverser -->
  19 <subscriber
  20   for=".IMallApplication
  21        zope.publisher.interfaces.browser.IBrowserRequest"
  22   provides="z3c.traverser.interfaces.ITraverserPlugin"
  23   factory="z3c.traverser.traverser.ContainerTraverserPlugin"
  24 />

И для zope.contentprovider:

   1 <!-- register named adapter for menu provider -->
   2 <adapter
   3   provides="zope.contentprovider.interfaces.IContentProvider"
   4   factory="tfws.menu.provider.MenuProvider"
   5   name="tfws.menu"
   6   />
   7 
   8 <!-- this does the directlyProvides -->
   9 <interface
  10   interface="tfws.menu.provider.IMenu"
  11   type="zope.contentprovider.interfaces.ITALNamespaceData"
  12   />

Как объявить глобальные константы в ZCML?

Ссылка: http://mail.zope.org/pipermail/zope3-users/2006-September/004381.html

Можно просто использовать директиву <utility>, и сгруппировать константы в логические участки.

interfaces.py:

   1 class IDatabaseLoginOptions(Interface):
   2      username = Attribute()
   3      password = Attribute()

config.py:

   1 class DatabaseLoginOptions(object):
   2      implements(IDatabaseLoginOptions)
   3      username = 'foo'
   4      password = 'bar'

configure.zcml:

   1 <utility factory=".config.DatabaseLoginOptions" />

использование:

   1 opts = getUtility(IDatabaseLoginOptions)

Очевидно, что нужно проделать немного больше работы, нежели просто задекларировать несколько констант в ZCML, но глобальные константы вносят много проблем, неважно, определены они в Python, или в XML. Части вашего приложения предполагают их наличие с очень специфическими именами, а их типы нельзя проверить.

Как установить скин по умолчанию?

Используйте директиву browser:defaultSkin:

   1 <browser:defaultSkin name="skinname" />

Для получения более подробной информации о скинах, обратитесь к документации.

Как зарегистрировать контент провайдер без использования менеджера вьюлетов?

Вам нужно создать и зарегистрировать простой адаптер для объекта, запроса и вида, который реализует интерфейс IContentProvider:

   1 class LatestNews(object):
   2 
   3     implements(IContentProvider)
   4     adapts(Interface, IDefaultBrowserLayer, Interface)
   5 
   6     def __init__(self, context, request, view):
   7         self.context = context
   8         self.request = request
   9         self.__parent__ = view
  10 
  11     def update(self):
  12         pass
  13 
  14     def render(self):
  15         return 'Latest news'

В ZCML:

   1 <adapter name="latestNews"
   2          for="* zope.publisher.interfaces.browser.IDefaultBrowserLayer *"
   3          provides="zope.contentprovider.interfaces.IContentProvider"
   4          factory=".LatestNews" />

Тогда их можно использовать в TAL шаблонах следующим образом:

   1 <div tal:content="provider latestNews" />

Также, вы, возможно, захотите передать через TAL некие параметры. Для получения информации о том, как это сделать, читайте документацию в zope.contentprovider. Если вы хотите привязать некий контент провайдер к скину, измените IDefaultBrowserLayer на ваш интерфейс скина.

Как подключить статическое содержимое?

Взгляните на директивы <resource> и <resourceDirectory> - они позволяют публиковать статические файлы посредством Zope. Обратитесь к документации по ресурсам браузера для получения более полной информации.

Доступны ли исходики сервера Webdav в !BlueBream?

Ссылка: http://mail.zope.org/pipermail/zope3-users/2006-September/004648.html

Да, вот ссылка на репозиторий: http://svn.zope.org/zope.webdav/trunk

Как использовать переопределения в сборщике в site.zcml для рецепта zc.zope3recipes:app?

Ссылка: http://mail.zope.org/pipermail/zope3-users/2007-April/006106.html

{{{highlight xml <includeOverrides package="myapp" file="overrides.zcml" /> }}}

Как сделать свой траверсинг в !BlueBream?

Обратитесь к этому блогу: http://mg.pov.lt/blog/zope3-custom-traversal.html

Программирование

Доступна ли документация по API онлайн?

Инфраструктура документации Zope3 обладает возможностью генерации html содержимого на лету. Это делает ее немножко медленной при просмотре на старых машинах.

Закешированный вариант документации (а поэтому быстрый) доступен на: http://apidoc.zope.org/++apidoc++/

Как вытянуть проект/пакет из SVN-репозитория?

Взгляните сюда: http://docs.zope.org/developer/noncommitter-svn.html

Как сделать апгрейд с более старого релиза?

Обновите versions.cfg и укажите URL версионного файла BlueBream нового релиза и запустите сборщик.

Нужно ли мне каждый раз перезагружать сервер при изменении файлов кода?

Нет, не нужно, если ві пользуетесь опцией --reload команды paster serve. То есть, запускать сервер следует так:

   1 ./bin/paster serve --reload debug.ini

Мы рекомендуем писать автоматизированные тесты для просмотра эффекта, который произвели изменения. Вначале это кажется надоедливым, но, войдя в привычку, становится неотъемлимой и полезной частью процесса разработки.

Как автоматически создавать нужный объект при старте приложения?

http://mail.zope.org/pipermail/zope-dev/2007-December/030562.html

Вы можете сделать это подписываясь на событие IDatabaseOpenedWithRootEvent (из zope.app.appsetup)

Пример кода:

   1 from zope.app.appsetup.interfaces import IDatabaseOpenedWithRootEvent
   2 from zope.app.appsetup.bootstrap import getInformationFromEvent
   3 import transaction
   4 
   5 @adapter(IDatabaseOpenedWithRootEvent)
   6 def create_my_container(event):
   7     db, connection, root, root_folder = getInformationFromEvent(event)
   8     if 'mycontainer' not in root_folder:
   9         root_folder['mycontainer'] = MyContainer()
  10     transaction.commit()
  11     connection.close()

Потом зарегистрируйте подписчик в configure.zcml:

   1 <subscriber handler="myapp.create_my_container" />

Как сделать валидацию двух или более полей одновременно?

Представьте себе простой пример: есть объект личность. Этот объект имеет атрибуты name, email и phone. Как реализовать правило валидации, которое определяет, существует ли email или phone, но необязательно оба.

Сначала сделаем вызываемый объект - либо простую функцию, либо вызываемый класс:

   1 >>> def contacts_invariant(obj):
   2 ...     if not (obj.email or obj.phone):
   3 ...         raise Exception("At least one contact info is required")

Теперь, определим интерфейс объекта следующим образом. Используйте функцию interface.invariant для установки инварианта:

   1 >>> class IPerson(interface.Interface):
   2 ...
   3 ...     name = interface.Attribute("Name")
   4 ...     email = interface.Attribute("Email Address")
   5 ...     phone = interface.Attribute("Phone Number")
   6 ...
   7 ...     interface.invariant(contacts_invariant)

Теперь используйте метод validateInvariants для валидации:

   1 >>> class Person(object):
   2 ...     interface.implements(IPerson)
   3 ...
   4 ...     name = None
   5 ...     email = None
   6 ...     phone = None
   7 >>> jack = Person()
   8 >>> jack.email = u"jack@some.address.com"
   9 >>> IPerson.validateInvariants(jack)
  10 >>> jill = Person()
  11 >>> IPerson.validateInvariants(jill)
  12 Traceback (most recent call last):
  13 ...
  14 Exception: At least one contact info is required

Как получить родителя location?

Для того, чтобы получить родителя объекта используйте zope.traversing.api.getParent(obj). Для получения списка родительских объектов - используйте zope.traversing.api.getParents(obj).

Как установить заголовок Content-Type HTTP-запроса?

Из IRC (http://zope3.pov.lt/irclogs/%23zope3-dev.2006-06-20.log.html):

Is there any way using the browser:page directive, that I can
specify that the Type of a page rendered is not "text/html" but
rather "application/vnd.mozilla.xul+xml"?

Используйте request.response.setHeader(‘content-type’, ...)

Документации/Bluebream/Bluebreamfaq (последним исправлял пользователь RostislavDzinko 2010-07-05 11:23:27)