Различия между версиями 14 и 15
Версия 14 от 2010-07-05 13:52:02
Размер: 8490
Редактор: RostislavDzinko
Комментарий:
Версия 15 от 2010-07-05 13:57:56
Размер: 9993
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 124: Строка 124:

Каждый персистентный объект, хранящийся в ZODB, доступен через виды, которые отвечают за его отображение. URL - это местонахождение, из которого объект доступен через браузер. Например, если пользователь пытается отобразить '''foo''', который находится в '''bar''', то наберет: http://server/foo/bar. Объект вытаскивается публикатором (publisher), который проходится по дереву объектов, начиная с корня. В нашем случае, он переходит на '''foo''', опрашивает его на предмет наличия в нем объекта '''bar''', и так дальше. '''foo''' укажет на '''bar''' публикатору, потому что его свойство '''__name__''' содержит значение '''bar'''.

Получения URL объекта производится обратным проходом от объекта к корню, с параллельным построением строки с именами всех объектов, по которым проходится публикатор.

Основная разница между более старыми версиями в том, что '''bar''' не хранит свой URL.

BlueBream How To

Виды по умолчанию для объектов

В BlueBream, вид обозревателя доступен посредством символов @@ перед его именем. Например, если у вас есть зарегистрированный вид с именем testview для контейнера с именем myobject, он доступен следующим образом: myobject/@@testview.

Контейнер

любой объект, реализующий интерфейс zope.content.interfaces.IContainer.

Вид также доступен без использования символов @@, при условии, что контент-объект с тем же именем не существует в рамках данного контейнера. В предыдущем примере, если объекта с именем testview нет в контейнере, то вид доступен через myobject/testview. Но BlueBream рекомендует всегда использовать символы @@ для доступа к видам.

Контент-объект

Если интерфейс предоставляет интерфейсный тип zope.app.content.interfaces.IContentType, то все объекты, предоставляющие этот интерфейс считаются контент-объектами.

В BlueBream index зарегистрирован как вид для интерфейса zope.container.interfaces.IContainer. Следовательно, если вы попытаетесь получить доступ к контейнеру без указания имени вида - BlueBream постарается отобразить вид зарегистрированный под именем index.

Вы можете изменить имя вида по умолчанию для конкретного типа объектов с помощью директивы browser:defaultView, доступной из zope.publisher. Если имя вида по умолчанию не настроено, и вы пытаетесь получить доступ к объекту не указывая имя вида, то получите ошибку ComponentLookupError со следующим сообщением: Couldn't find default view name. Например, если вы пытаетесь получить доступ к корневой папке следующим образом: http://localhost:8080/, а имя вида по умолчанию не настроено, то ошибка будет следующей:

ComponentLookupError: ("Couldn't find default view name",
<zope.site.folder.Folder object at 0xa3a09ac>,
<zope.publisher.browser.BrowserRequest instance
URL=http://localhost:8080>)

In order to use any ZCML except few built-ins like configure and include, you include the ZCML where it is defined the directive, conventionally in BlueBream it will be inside meta.zcml for any package. For example, to use defaultView directive, you need to include meta.zcml file inside zope.publisher:

  • <include package="zope.publisher" file="meta.zcml" />

Если вы создали приложение посредством шаблона проекта bluebream, у вас этой ошибки не возникнет, потому что в этом случае вид по умолчанию с именем index уже есть и настроен в конфигурационном файле application.zcml внутри главного пакета.

Если имя по умолчанию настроено, но вида с таким именем не существует, вы получите ошибку NotFound при попытке получить доступ к объекту прямо без указания имени вида. Например, если вид по умолчанию - index, а такой вид не зарегистрирован для корневой папки, то вы получите примерно следующую ошибку:

NotFound: Object: <zope.site.folder.Folder object at 0xac9b9ec>,
name: u'@@index'

Как упоминалось ранее, директива browser:defaultView определена в zope.publisher. Чтобы ее использовать, нужно включить meta.zcml директивой include:

   1 <include package="zope.publisher" file="meta.zcml" />

Например, вы можете указать вид по молчанию для IContainer следующим образом:

   1 <browser:defaultView
   2    name="index"
   3    for="zope.container.interfaces.IContainer"
   4    />

Если index зарегистрирован как имя вида по умолчанию, а вид явно не указан в URL, BlueBream попытается получить вид @@index для контейнеров. Но вы должны иметь вид, зарегистрированный под таким именем для получения к нему доступа, в противном случае будет вызвано исключение NotFound.

Подробнее о регистрации браузерных видов директивой browser:page рассматривается в документации к браузерным видам.

Добавление новой зависимости (пакета)

Вы работаете в вашем экземпляре приложения или разрабатываете свой пакет, и понимаете, что он может быть полезным еще где-нибудь, скажем пакет ldappas. Отредактируйте setup.py и добавьте имя пакета в install_requires:

   1 setup(name='ticketcollector'
   2       ...
   3       install_requires = ['setuptools',
   4                           ...
   5                           'ldappas',
   6                          ],
   7       ...

Теперь наступает время для перестройки приложения:

   1 $ ./bin/buildout

И наконец, не забудьте зарегистрировать новый пакет в etc/site.zcml:

   1 <configure xmlns="http://namespaces.zope.org/zope"
   2   ...
   3   <include package="ldappas" />
   4   ...
   5 </configure>

Если в этом пакете есть новая ZCML директива, вам нужно подключить конфигурационный файл, в котором эта директива зарегистрирована. Принято регистрировать ZCML директивы в пакете meta. Используйте опцию file как показано ниже:

   1 <configure xmlns="http://namespaces.zope.org/zope"
   2   ...
   3   <include package="some.package" file="meta.zcml" />
   4   <include package="ldappas" />
   5   ...
   6 </configure>

Теперь нужно перезапустить приложение:

   1 $ ./bin/paster serve debug.ini

Получение абсолютного URL объекта

BlueBream имеет другой, более ясный подход к обработке URL'ов объектов. Этот рецепт показывает, как получить URL для заданного объекта, и логику действий, которые выполняются за кулисами. Этот HOWTO предполагает, что вы подключили zope.traversing.browser в etc/site.zcml следующим образом:

   1 <include package="zope.traversing.browser" />

Понимание механизма URL

Каждый персистентный объект, хранящийся в ZODB, доступен через виды, которые отвечают за его отображение. URL - это местонахождение, из которого объект доступен через браузер. Например, если пользователь пытается отобразить foo, который находится в bar, то наберет: http://server/foo/bar. Объект вытаскивается публикатором (publisher), который проходится по дереву объектов, начиная с корня. В нашем случае, он переходит на foo, опрашивает его на предмет наличия в нем объекта bar, и так дальше. foo укажет на bar публикатору, потому что его свойство name содержит значение bar.

Получения URL объекта производится обратным проходом от объекта к корню, с параллельным построением строки с именами всех объектов, по которым проходится публикатор.

Основная разница между более старыми версиями в том, что bar не хранит свой URL.

Документации/Bluebream/BluebreamHowTo (последним исправлял пользователь RostislavDzinko 2010-07-05 14:52:02)