2009-04-06 9 views
9

Ich verwende Site Wide Caching mit memcached als Backend. Ich möchte Seiten im Cache ungültig machen, wenn sich das zugrunde liegende Datenbankobjekt ändert.Bestimmte Gegenstände aus Djangos Cache entfernen?

Wenn der Seitenname ändert sich dann würde ich den ganzen Cache ungültig machen (wie es die Navigation auf jeder Seite beeinflusst. Clumsy, aber ausreichend für meine Bedürfnisse.

ich die Seiteninhalt ändert dann möchten die Wenn nur ungültig nur die Seite Cache.

gibt es eine einfache Möglichkeit, dies zu tun?

Antwort

4

tghw Lösung funktioniert nicht wirklich, weil der Cache-Schlüssel nicht der absolute Pfad ist. Der Schlüssel wird aus dem absoluten Pfad und den HTTP-Headern berechnet. Ein Beispiel finden Sie in this question.

5

ich habe nicht viel Caching mit Django getan, aber ich denke, was Sie hier sind signals wollen.

Sie kann eine 012 einrichtenSignal auf dem zugrunde liegenden Objekt, und die Callback-Funktion diese Seite im Cache ungültig machen.

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) 

Dies sollte das Objekt ordnungsgemäß aus dem Cache entfernen, wenn es aktualisiert wird.

+0

Ich wusste nichts über cache.delete Hat senders.get_absolute_url() mir den richtigen Cache-Schlüssel? Ich kann keine Dokumentation darüber sehen, wie der Site-weite Cache Schlüssel generiert. –

+0

Funktioniert es wirklich ?? – simplyharsh

+1

"Standardmäßig erstellt das Cache-System von Django seine Cache-Schlüssel mit dem angeforderten Pfad (z. B."/stories/2005/jun/23/bank_robbed/")." (http://docs.djangoproject.com/de/dev/topics/cache/) – michuk

Verwandte Themen