plone.memoize包提供了方便的辅助函数来缓存各种函数的值。
在当前HTTP请求(self.request)的生命周期中缓存view / viewlet方法值的最佳做法是什么。这在plone.memoize文档中并不完全清楚。
示例:
class MyView(grok.View):
# cache this by self.request
def getExpensiveFunction(self):
....
答案 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
变体,以便您只存储结果的一个副本。