2012-01-09 4 views
4

Я использую кеширование представления для проекта django.Очистка определенного кеша в 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..... 
+0

Я думаю, что ключи вы используете неверны. Вы можете попробовать использовать [этот скрипт] (http://simple-and-basic.com/2008/10/list-memcached-keys.html) на сервере memcached, чтобы перечислить ключи. После того, как у вас есть соответствующий ключ, попробуйте снова использовать метод cache.delete (key). – stephenmuss

+0

Вот ссылка на обновленные документы кэш-памяти django: [Django Caches] (https://docs.djangoproject.com/en/1.9/topics/cache/#django-s-cache-framework) – turtlefranklin

ответ

12

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

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

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

    $ ./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/? 
    
+2

Это похоже на принятый ответ. Каков был правильный ключ? У меня есть такая же проблема, и я не могу найти правильный ключ. – caliph

+0

@caliph У меня тоже был этот вопрос. Оказывается, что django cache_page decorator создает ключ, основанный на объекте запроса, что является лучшим способом объяснить его, чем документы. Так, например, вы получите ключ, который будет выглядеть так, когда все будет сказано и сделано: ": 1: views.decorators.cache.cache_page..GET.3e144467194c80669ac0d860e0368097.ec0b8f79f7413e4479a39eb2bb0104f0.en-us.America/New_York" , Существует более краткое объяснение [здесь] (http://stackoverflow.com/a/2268583/5597611) –