Django中的cache.fetch?

Django缓存有一个类似于Rails的cache.fetch的方法吗? ( http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#M001023)rails cache fetch的工作方式如下:

 cache.fetch(“my_key”){
   //返回我想要放在my_key中的内容,如果它是空的
   “SOME_VALUE”
 }

它很有用,因为它会检查缓存,并返回缓存的值(如果存在)。 如果没有,它将在缓存中存储“some_value”,然后返回“some_value”。

在Django中是否有相同的function? 如果没有,如果我要实现这样的function,那么Python的语法会是什么样子?

我认为你必须编写的代码是这样的:(编辑)

def get_value(param1,param2): return "value %s - %s " % (str(param1),str(param2)) def fetch(key,val_function,**kwargs) val = cache.get(key) if not val: val = val_function(**kwargs) cache.set(key,val) return val 

你会这样称呼它:

 fetch('key',get_value,param1='first',param2='second') 

Julian的代码相当不错,但不采用位置args(例如,当你想使用sorted()时)。 这是我的修复:

 def get_value(param1,param2): return "value %s - %s " % (str(param1),str(param2)) def fetch(key,val_function, *args, **kwargs) val = cache.get(key) if not val: val = val_function(*args, **kwargs) cache.set(key,val) return val 

如果键不退出则获取默认值,您可以提供第二个参数:

 cache.get('key', 'default') 

cache.get()可以采用默认参数。 如果缓存中不存在该对象,则指定返回哪个值。

要在密钥不存在时保存缓存中的默认值,可以提供自定义缓存后端 。 例如,这会扩展db缓存后端(但与其他人一样):

 from django.core.cache.backends import db class CustomCache(db.CacheClass): def get(self, key, default=None): result = super(CustomCache, self).get(key, default) if result == default: self.add(key, default) return default return result 

但我不认为这会增加任何价值。

更新:
响应对其他post的评论:是,它将默认值与返回值进行比较 ,如果两者相等,则该值将添加到缓存中。 但是,如果密钥不在缓存中,则cache.add仅设置新值(与始终覆盖的cache.set形成对比):

仅在密钥尚不存在时添加密钥,请使用add()方法。 它采用与set()相同的参数,但如果指定的键已存在,则不会尝试更新缓存