2009-04-06 8 views
9

J'utilise la mise en cache à l'échelle du site avec memcached en tant que backend. Je voudrais invalider les pages dans le cache lorsque l'objet de base de données sous-jacent change.Supprimer des éléments spécifiques du cache de Django?

Si le nom de la page change alors j'annuleraient l'ensemble cache (car il affecte la navigation sur chaque page. Clumsy mais suffisant pour mes besoins.

Si seulement les changements de contenu de la page alors je voudrais annuler la cache de seulement cette page.

est-il un moyen facile de le faire?

Répondre

4

La solution de tghw ne fonctionne pas réellement, car la clé de cache n'est PAS le chemin absolu. La clé est calculée à partir du chemin absolu et des en-têtes HTTP. Voir this question pour un exemple.

5

Je ne l'ai pas fait beaucoup de mise en cache avec Django, mais je pense que ce que vous voulez ici sont signals.

vous

peut mettre en place un post_save signal sur l'objet sous-jacent, et que la fonction de rappel invalide cette page dans le cache.

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) 

Ceci devrait supprimer correctement l'élément du cache lorsqu'il est mis à jour.

+0

Je ne connaissais pas le cache.delete Est-ce que sender.get_absolute_url() me fournit la bonne clé de cache? Je ne vois aucune documentation sur la façon dont le cache à l'échelle du site génère des clés. –

+0

Ça marche vraiment ?? – simplyharsh

+1

"Par défaut, le système de cache de Django crée ses clés de cache en utilisant le chemin demandé (par exemple,"/stories/2005/jun/23/bank_robbed/")." (http://docs.djangoproject.com/fr/dev/topics/cache/) – michuk

Questions connexes