Очистка конкретного кеша в Django - PullRequest
8 голосов
/ 09 января 2012

Я использую кэширование представлений для проекта django.

В нем говорится, что кеш использует URL-адрес в качестве ключа, поэтому мне интересно, как очистить кеш одного из ключей, если пользователь обновляет / удаляет объект.

Пример: пользователь публикует сообщение в блоге на domain.com/post/1234/ .. Если пользователь редактирует это, я хотел бы удалить кэшированную версию этого URL, добавив какую-либо команду удаления кэша в конце представления это сохраняет отредактированный пост.

Я использую:

@cache_page(60 * 60)
def post_page(....):

Если post.id равен 1234, похоже, что это может сработать, но это не так:

def edit_post(....):
    # stuff that saves the edits
    cache.delete('/post/%s/' % post.id)
    return Http.....

Ответы [ 2 ]

18 голосов
/ 09 января 2012

Из django кеш документов , он говорит, что cache.delete('key') должно быть достаточно. Итак, мне приходит в голову две проблемы, которые могут у вас возникнуть:

  1. Ваш импорт некорректен, помните, что вы должны импортировать cache из модуля django.core.cache:

    from django.core.cache import cache
    
    # ...
    cache.delete('my_url')
    
  2. Неправильный ключ, который вы используете (возможно, он использует полный URL, включая «domain.com»). Чтобы узнать, какой именно URL вы можете ввести в свою оболочку:

    $ ./manage.py shell
    >>> from django.core.cache import cache
    >>> cache.has_key('/post/1234/')
    # this will return True or False, whether the key was found or not
    # if False, keep trying until you find the correct key ...
    >>> cache.has_key('domain.com/post/1234/') # including domain.com ?
    >>> cache.has_key('www.domain.com/post/1234/') # including www.domain.com ?
    >>> cache.has_key('/post/1234') # without the trailing / ?
    
0 голосов
/ 18 сентября 2018

Я делаю функцию для удаления ключа, начиная с некоторого текста. Это поможет мне удалить динамические ключи.

список сообщений в кэше

def get_posts(tag, page=1):
    cached_data = cache.get('list_posts_home_tag%s_page%s' % (tag, page))
    if not cached_data:
        cached_data = mycontroller.get_posts(tag, page)
        cache.set('list_posts_home_tag%s_page%s' % (tag, page), cached_data, 60)
    return cached_data

при обновлении любого сообщения звоните flush_cache

def update(data):
    response = mycontroller.update(data)
    flush_cache('list_posts_home')
    return response

flush_cache для удаления любого динамического кэша

def flush_cache(text):
    for key in list(cache._cache.keys()):
        if text in key:
            cache.delete(key.replace(':1:', ''))

Не забудьте импортировать кеш из django

from django.core.cache import cache
...