Удалить определенные предметы из кеша Django?
Я использую кэширование всего сайта с memcached в качестве бэкэнда. Я хотел бы сделать недействительными страницы в кэше, когда базовый объект базы данных изменяется.
Если имя страницы изменится, я лишу законной силы весь кеш (так как это влияет на навигацию на каждой странице. Неуклюжий, но достаточный для моих нужд).
Если меняется только содержимое страницы, я бы хотел сделать недействительным кеш только этой страницы.
Есть простой способ сделать это?
2 ответа
Решение tghw на самом деле не работает, потому что ключ кеша НЕ является абсолютным путем. Ключ вычисляется из абсолютного пути и заголовков HTTP. Смотрите этот вопрос для примера.
Я не слишком много кешировал с Джанго, но думаю, что вы хотите здесь signals
,
Вы можете настроить post_save
сигнал на базовый объект, и функция обратного вызова делает эту страницу недействительной в кеше.
from django.core.signals import post_save
from django.core.cache import cache
def invalidate_cache(sender, **kwargs):
# invalidate cache
cache.delete(sender.get_absolute_url()) # or any other pertinent keys
post_save.connect(invalidate_cache, sender=UnderlyingModel)
Это должно правильно удалить элемент из кэша при его обновлении.