Версия 14 от 2010-07-05 13:52:02

Убрать это сообщение

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