3

plone.memoize 包提供了方便的帮助函数来缓存各种函数的值。

在当前 HTTP 请求 (self.request) 的生命周期内缓存视图/视图方法的值的最佳实践是什么。这在 plone.memoize 文档中并不完全清楚。

例子:

   class MyView(grok.View):

         # cache this by self.request
         def getExpensiveFunction(self):
               ....
4

1 回答 1

4

由于 BrowserPage 视图实例的生命周期通常已经是请求的持续时间,因此您通常也可以使用plone.memoize.instancememoizing 装饰器:

from plone.memoize.instance import memoize

class MyView(grok.View):

    @memoize
    def getExpensiveFunction(self):
        # ....

毕竟,BrowserPage 通常会针对给定的 URL 进行查找,在查找时实例化,并在生成视图时丢弃。一个新的请求会产生一个新的实例。

view memoizer 存储当前请求上的缓存,并添加当前上下文路径(或上下文的 id,如果没有路径)作为缓存键。如果在请求期间在不同的位置查找视图,您可以使用它而不是实例记忆器:

from plone.memoize.view import memoize

class MyView(grok.View):

    @memoize
    def getExpensiveFunction(self):
        # ....

实用程序视图,诸如此类@@plone_context,从plone.memoize.view.memoize.

如果您的昂贵方法独立于视图上下文,请使用memoize_contextless装饰器;这从缓存键中省略了视图上下文路径:

from plone.memoize.view import memoize_contextless

class MyView(grok.View):

    @memoize_contextless
    def getExpensiveFunction(self):
        # ....

因此,如果.getExpensiveFunction()无论此视图的上下文是什么(无论是站点根目录还是内容树深处的某个位置)都返回相同的信息,请使用该_contextless变体,以便您仅存储一份结果副本。

于 2012-08-24T15:40:58.823 回答