Python 如何结合金字塔烧杯装饰风格的缓存和金字塔tm?

Python 如何结合金字塔烧杯装饰风格的缓存和金字塔tm?,python,sqlalchemy,transactions,pyramid,beaker,Python,Sqlalchemy,Transactions,Pyramid,Beaker,使用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']

使用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\u region
缓存
get\u item\u 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'])

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

自金字塔以来,我使用dogpile缓存进行缓存。我很确定在计算密钥时它有某种机制可以忽略第一个参数,但我找不到任何文档:-(感谢您的确认,这也是我自发想到的唯一解决方案。