2

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

cache.fetch("my_key") {
  // 如果 my_key 为空,则返回我想要放入的内容
  “一些价值”
}

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

在 Django 中是否有这样的等价物?如果不是,如果我要实现这样的函数,Python 语法会是什么样子?

4

3 回答 3

4

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

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')
于 2010-02-07T07:47:55.340 回答
2

Julian 的代码非常好,但不采用位置参数(例如,当您想使用 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
于 2010-04-01T14:05:45.037 回答
0

如果键不存在,那么要获得默认值,您可以提供第二个参数:

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

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

更新:
针对另一篇文章的评论:是的,它将默认值与返回值进行比较,如果两者相等,则将该值添加到缓存中。 cache.add仅当键不在缓存中时才设置新值(与cache.set始终覆盖相反):

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

于 2010-02-06T19:06:39.577 回答