Найти - Пользователи
Полная версия: как живут объекты в zope3?
Начало » Zope/Plone/Bluebream » как живут объекты в zope3?
1
misha111
Здравствуйте, может кто то сможет подсказать ссылку на толковую статью, поясняющую
достаточно просто что происходит с объектами в zope3.
То, что я сам начитался - что объекты живут в zodb, укладываются туда
при рестарте, на основании того, что написано в .zcml
Ну и при обработке запроса достаются с помошью утилиты cPickle.
но как то надо вот по-детальнее, вот по такой схеме

запрос->(создание экземпляра->десериализация(когда, зачем, первый раз там ничего нет)) - правильнее наверно сказать что это делает утилита cPickle и объект уже готовый ->тут публикация и все такое не так важное->сериализация->удаление

Вот, вот такое надо, всё что я рою - кусочное и обрывистое, не позволяющее представить полную картину.
regall
misha111
То, что я сам начитался - что объекты живут в zodb, укладываются туда
при рестарте, на основании того, что написано в .zcml
Неверно. Все объекты, которые регистрируются в ZCML: адаптеры, утилиты и т.д. - живут в памяти. В ZODB живут только объекты, которые наследуются от
persistent.Persistent
и сохранены туда.

misha111
Ну и при обработке запроса достаются с помошью утилиты cPickle.
Верно, в ZODB в виде узлов деревьев они физически представляют собою пиклы объектов.

misha111
запрос->(создание экземпляра->десериализация(когда, зачем, первый раз там ничего нет)) - правильнее наверно сказать что это делает утилита cPickle и объект уже готовый ->тут публикация и все такое не так важное->сериализация->удаление
Для пользователя это в общем случае не важно. Объекты достаются из базы по запросу, например, через getUtility. При таком запросе может быть взят объект как из базы, так и из памяти (если он из ZCML и неперсистентный). В вашей схеме мне непонятно практически ничего.
Происходит все так:
1. Делается запрос к серверу
2. BB траверсит по объектам и видам (опять же таки виды тоже могут быть traversable) и, исходя из этого находит необходимый код для построения страницы.
3. В коде вы сами выбираете объекты, которые вам нужны для шаблона.
4. Отрисовывается шаблон.
При этом всем работа с ZODB неявно происходит постоянно - поиск утилит, адаптеров (все это может быть в базе, так и не в базе ее), траверсинг, выборка объектов во view.

В общем, сомневаюсь что ответил на ваш вопрос, так как до конца его не понял, но, думаю, некие моменты осветил, и вы захотите что-нибудь уточнить =).
misha111
да, спасибо, в принципе ответ понятен, но нужно вот именно то, что под словами “Для пользователя это в общем случае не важно”.

То еть вот мы в описанной вами последовательности дощли до щага 3, где нам понадобился объект, что при этом происходит?
Мы либо достаём его из zodb в память или уже берём из памяти, если он не персистентный (я так понимаю что если объект персистентный, но выполняются параллельно два запроса, где при первом он был поднят в память, то при втором он уже берётся из памяти? И один ли объект или он свой для каждого запроса - дубликат ли?), передаём на него контекст и реквест, он инициализируется, и дальше мы отрисовывем шаблон через view.какой то метод, а что происходит с этим объектом после того как он нам не нужен? Что происходит с объектом если он в памяти(не персистентный)? где он удаляется очищается и т.д.
Что происходит с объектом при этом всём и один ли объект на несколько запросов к нему?

Кроме того, например у нас есть какой то объект, он висит в памяти, и есть два параллельных обращения к нему, каждый со своим request от двух разных пользователей, как он себя ведёт?

Очень хотел бы чтоб меня попраыили, так как у меня очень много догадок, не знаю, насколько они соответствуют реальности
regall
misha111
где нам понадобился объект, что при этом происходит?
zodb.org - тут как раз описано все, что нужно знать для работы с ZODB API. Zope имеет своего рода обертки для работы с этой БД, так что вы не работаете с БД напрямую, за вас все деалет zope. Управлять этим вы можете вручную через объект persistent.Persistent, либо с помощью генерации событий (например, ObjectCreatedEvent).
misha111
Мы либо достаём его из zodb в память или уже берём из памяти, если он не персистентный
Если этот объект зарегистрирован в ZCML (то есть он является так называемым глобальным (он действует во всем zope instance), тогда как еще есть локальные в ZODB, и они могут быть найдены в зависимости от контекста, например в одной базе ZODB у вас лежат несколько сайтов, и вам не нужно, чтобы при поиске адаптера в одном сайте был найден неверный адаптер из другого сайта ), то он живет в памяти, оттуда и возьмется. Если же это локальный объект, произойдет его выборка из ZODB (как это делается, найдете по ссылке), то есть он поднимается в память, никаких дубликатов нет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB