cache.fetch в Django? - PullRequest
       17

cache.fetch в Django?

2 голосов
/ 06 февраля 2010

Есть ли в кешировании Django метод, аналогичный кешу Rails cache.fetch? (http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#M001023) Выборка кэша рельсов работает как:

cache.fetch("my_key") {
  // return what I want to put in my_key if it is empty
  "some_value"
}

Это полезно, потому что проверяет кеш и возвращает значение кеша, если оно там есть. Если нет, он сохранит «some_value» в кеше, а затем вернет «some_value».

Есть ли эквивалент в Джанго? Если нет, то как бы выглядел синтаксис Python для этого, если бы я реализовал такую ​​функцию?

Ответы [ 3 ]

4 голосов
/ 07 февраля 2010

Я думаю, что код, который вам нужно написать, будет выглядеть так: (РЕДАКТИРОВАТЬ)

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')
2 голосов
/ 01 апреля 2010

Код Джулиана довольно хорош, но не принимает позиционные аргументы (например, когда вы хотите использовать 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
0 голосов
/ 06 февраля 2010

Хорошо, чтобы получить значение по умолчанию, если ключ не выходит, вы можете предоставить второй параметр:

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(), но не будет пытаться обновить кэш , если указанный ключ уже присутствует.

...