缓存视图/ viewlet方法通过self.request返回值

时间:2012-08-24 15:03:14

标签: plone

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

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

示例:

   class MyView(grok.View):

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

1 个答案:

答案 0 :(得分:4)

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

from plone.memoize.instance import memoize

class MyView(grok.View):

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

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

视图存储器将缓存存储在当前请求中,并将当前上下文路径(或上下文的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变体,以便您只存储结果的一个副本。