如何将 pyramid_beaker 装饰器式缓存与 pyramid_tm 结合起来?
How can one combine pyramid_beaker decorator-style caching and pyramid_tm?
使用 Pyramid / pyramid_tm
我最终将加入当前事务的 dbsession
对象传递给封装我的代码的方法。例如
def get_item_name(dbsession, item_id):
item = dbsession.query(...)
return item.name
def view_func(request):
item_name = get_item_name(request.dbsession, request.GET['item_id']
...
现在,如果我想使用烧杯缓存装饰器 @cache_region
来缓存 get_item_name
的结果,我将永远不会命中缓存,因为 dbsession
是缓存的一部分关键。
优雅地解决这个问题的常见模式是什么?
至少一种模式是装饰一个闭包,它只接受您要缓存的参数并从非本地范围访问其他变量,例如 request/dbsession。
def view_func(request):
@cache.region('short_term')
def get_item_name(item_id):
item = request.dbsession.query(...)
return item.name
item_name = get_item_name(request.GET['item_id'])
这种模式在烧杯文档中很常见。
使用 Pyramid / pyramid_tm
我最终将加入当前事务的 dbsession
对象传递给封装我的代码的方法。例如
def get_item_name(dbsession, item_id):
item = dbsession.query(...)
return item.name
def view_func(request):
item_name = get_item_name(request.dbsession, request.GET['item_id']
...
现在,如果我想使用烧杯缓存装饰器 @cache_region
来缓存 get_item_name
的结果,我将永远不会命中缓存,因为 dbsession
是缓存的一部分关键。
优雅地解决这个问题的常见模式是什么?
至少一种模式是装饰一个闭包,它只接受您要缓存的参数并从非本地范围访问其他变量,例如 request/dbsession。
def view_func(request):
@cache.region('short_term')
def get_item_name(item_id):
item = request.dbsession.query(...)
return item.name
item_name = get_item_name(request.GET['item_id'])
这种模式在烧杯文档中很常见。