如何将pyramid_beaker装饰器式缓存和pyramid_tm结合起来?

问题描述 投票:0回答:1

使用 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']
    ...

现在,如果我想使用烧杯缓存装饰器

get_item_name
来缓存
@cache_region
的结果,我永远不会获得缓存命中,因为
dbsession
是缓存键的一部分。

优雅地解决这个问题的常见模式是什么?

python sqlalchemy transactions pyramid beaker
1个回答
1
投票

至少一种模式是装饰一个闭包,该闭包仅接受要缓存的参数并从非本地范围访问其他变量,例如 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'])

这种模式在烧杯文档中很常见。

© www.soinside.com 2019 - 2024. All rights reserved.