кеширование

2 views
Skip to first unread message

Garanin Michael

unread,
Jun 18, 2008, 4:09:37 PM6/18/08
to zope...@googlegroups.com
Всем привет!
Хочу использовать кеширование некоторых запросов.
То есть сделать стандартное поведение: когда приходит запрос на url, то
где-то ловить его и по условию либо доставать результат из кеш-хранилища
(memcached или ещё чего), либо "честно" готовить response (и если надо
класть его в кеш-хранилище).

Вопрос: как это лучше организовать и где поставить такой фильтр?
Спасибо за ответы!

astoon

unread,
Jun 18, 2008, 4:25:23 PM6/18/08
to zope...@googlegroups.com
http://pypi.python.org/pypi/lovely.responsecache/1.0.0a1 ?

19 июня 2008 г. 2:09 пользователь Garanin Michael <gar...@m-lan.ru> написал:



--
Ilshad Habibullin
Gadoz, Inc (http://www.gadoz.com)

Garanin Michael

unread,
Jun 18, 2008, 4:49:34 PM6/18/08
to zope...@googlegroups.com
я так понял, что для этого способа view надо писать по определённым
правилам.
вот только не хочется переделывать уже работающий код...

> http://pypi.python.org/pypi/lovely.responsecache/1.0.0a1 ?
>
> 19 июня 2008 г. 2:09 пользователь Garanin Michael <gar...@m-lan.ru

> <mailto:gar...@m-lan.ru>> написал:

astoon

unread,
Jun 18, 2008, 5:13:13 PM6/18/08
to zope...@googlegroups.com
Но вполне вероятно, что это окажется выгоднее, чем брать lovely.memcached и вручную
прописывать в коде где что закешировать. Правда, это будут уже не результаты рендеринга,
а просто какие-то места в коде.
Ну а если используются паджелеты и вьюлеты - то они ведь на zope.contentprovider основаны.
Когда куча вьюлетов с большими вычислениями - сам бог велел использовать это.

19 июня 2008 г. 2:49 пользователь Garanin Michael <gar...@m-lan.ru> написал:

Garanin Michael

unread,
Jun 19, 2008, 2:13:21 AM6/19/08
to zope...@googlegroups.com
согласен, но этот способ кеширует только view, а процесс треверса
объектов (и соответственно доступ в базу) не кешируется.
то есть при обработке
"http://localhost/APP/obj1/obj2/obj3/@@myview.html" кеширование
подключится только после треверса всех объектов.

А у меня APP-это из ZODB, а остальные objN-из рсубд, поэтому очень
хочется кешировать треверс, хотя бы после APP.
Пока у меня два кандидата на "копание":
1) ловить IBeforeTraverseEvent на APP и там уже развилку делать
2) посмотреть в сторону namespace (как например сделан "++language++",
или "++skin++") думаю может там как-то вклиниться можно.
что скажете?

> Но вполне вероятно, что это окажется выгоднее, чем брать
> lovely.memcached и вручную
> прописывать в коде где что закешировать. Правда, это будут уже не
> результаты рендеринга,
> а просто какие-то места в коде.
> Ну а если используются паджелеты и вьюлеты - то они ведь на
> zope.contentprovider основаны.
> Когда куча вьюлетов с большими вычислениями - сам бог велел
> использовать это.
>
> 19 июня 2008 г. 2:49 пользователь Garanin Michael <gar...@m-lan.ru

> <mailto:gar...@m-lan.ru>> написал:


>
> я так понял, что для этого способа view надо писать по определённым
> правилам.
> вот только не хочется переделывать уже работающий код...
>
> > http://pypi.python.org/pypi/lovely.responsecache/1.0.0a1 ?
> >
> > 19 июня 2008 г. 2:09 пользователь Garanin Michael
> <gar...@m-lan.ru <mailto:gar...@m-lan.ru>

> > <mailto:gar...@m-lan.ru <mailto:gar...@m-lan.ru>>> написал:

Nikolay Kim

unread,
Jun 19, 2008, 2:34:11 AM6/19/08
to zope...@googlegroups.com
On Thu, 2008-06-19 at 10:13 +0400, Garanin Michael wrote:
> согласен, но этот способ кеширует только view, а процесс треверса
> объектов (и соответственно доступ в базу) не кешируется.
> то есть при обработке
> "http://localhost/APP/obj1/obj2/obj3/@@myview.html" кеширование
> подключится только после треверса всех объектов.
>
> А у меня APP-это из ZODB, а остальные objN-из рсубд, поэтому очень
> хочется кешировать треверс, хотя бы после APP.
> Пока у меня два кандидата на "копание":
> 1) ловить IBeforeTraverseEvent на APP и там уже развилку делать
> 2) посмотреть в сторону namespace (как например сделан "++language++",
> или "++skin++") думаю может там как-то вклиниться можно.
> что скажете?

можно BrowserPublication свой сделать, и там обрабатывать запрос до
траверса.

Garanin Michael

unread,
Jun 19, 2008, 3:57:45 PM6/19/08
to zope...@googlegroups.com
Nikolay Kim пишет:
спасибо, это очень даже хорошая мысль ;-) самое то.
на всякий случай привожу два простых класса и кусочек zcml которые
демонстрируют реализацию.
/кстати как вариант использования: можно писать сколько ушло время на
генерацию страницы/


и ещё, пробив тему в django, увидел что они помимо встроенного
кеширования цельных страниц очень восхищаются
возможностью кеширования частей страниц. там типа есть теги для шаблона
которыми можно помечать условно-статичные места. признают правда что не
очень это "красиво". и теперь я понял, что решение реализованное в
"lovely.responsecache" как раз решает туже самую задачу. но по моему
гораздо более "правильно" и проще.


P.S.
пришлось тут разбираться с django, и у меня сложилось впечатление, что
добавь туда zope.interface, zope.formlib, тестирование (недавно добавили
правда) и это будет очень смахивать на z3.

################################################################
class MyCacheBrowserPublication(BrowserPublication):
implements(IPublication)
def callObject(self, request, ob):
res = super(MyCacheBrowserPublication,
self).callObject(request, ob)
# тут 'вилка' для кеширования
return res + '<!-- from cache -->'

class CacheBrowserFactory(BrowserFactory):
def __call__(self):
request_class = component.queryUtility(

interfaces.IBrowserRequestFactory, default=BrowserRequest)
return request_class, MyCacheBrowserPublication

<publisher
name="BROWSER"
factory=".CacheBrowserFactory"
methods="GET POST HEAD"
mimetypes="*"
priority="5"
/>

Reply all
Reply to author
Forward
0 new messages