由于 BrowserPage 视图实例的生命周期通常已经是请求的持续时间,因此您通常也可以使用plone.memoize.instance
memoizing 装饰器:
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
变体,以便您仅存储一份结果副本。