2016-11-02 5 views
0

Ich verwende redis zum Caching in einer Django-App. Ich benutze auch Django Rest Framework, und hier ist mein Problem.Cache aktualisieren, wenn sich Inhalt ändert, bevor Cache-TTL abläuft

Ich bin mit dem Cache-System wie folgt aus:

from django.views.decorators.cache import cache_page 

urlpatterns = [ 
... 
    url(r'^some_url/$', cache_page(CACHE_TTL)(SomeView.as_view()) 
... 
] 

Hier SomeView ist eine Klasse, die von APIView erbt.

Stellen Sie sich nun vor, wir stellen eine Anfrage an diese URL und wir erhalten ein JSON-Objekt, das eine Instanz dessen enthält, was diese URL zurückgibt.

Dann fahren wir fort, das Objekt zu löschen (mit django Admin-Schnittstelle) und die Anfrage erneut zu machen. Das erwartete Ergebnis ist ein leeres JSON-Objekt, aber das, was ich empfange, ist das gleiche Objekt unverändert, das gleiche passiert, wenn ein neues Objekt hinzugefügt wird, die Antwort immer noch nur ein Objekt.

Nach einiger Zeit (die TTL der Anfrage im Cache) ist das Ergebnis korrekt.

Also, wie kann ich django sagen, dass ein Cache-Eintrag nicht mehr gültig ist?

+0

Mögliche Duplikate von [Expire einen View-Cache in Django?] (Http://Stackoverflow.com/questions/2268417/expire-a-view-cache-in-django) – alazaro

+1

@alzaro, Es ist nicht das gleiche Frage, ist wahr, die Antwort der Frage, auf die Sie verweisen, lösen mein Problem, aber das ursprüngliche Problem ist nicht das gleiche. Ich möchte nicht ** den Cache ablaufen lassen **, ich möchte den ** Cache aktualisiert bekommen **. –

Antwort

0

Von Django’s cache framework:

Es gibt ein paar andere Möglichkeiten, Cache-Parameter zu steuern. Zum Beispiel ermöglicht HTTP Anwendungen Folgendes:

  • Definieren Sie die maximale Zeit, die eine Seite zwischengespeichert werden soll.

  • Geben Sie an, ob ein Cache immer nach neueren Versionen suchen soll und nur den zwischengespeicherten Inhalt bereitstellen soll, wenn keine Änderungen vorgenommen werden. (Einige Caches könnte im Cache gespeicherten Inhalte liefern, auch wenn der Server-Seite geändert, nur weil der Cache-Kopie abgelaufen ist noch nicht.)

In Django, verwenden Sie die cache_control Ansicht Dekorateur diese Cache-Parameter angeben. In diesem Beispiel zeigt cache_control Caches den Cache bei jedem Zugriff revalidate und im Cache gespeicherte Versionen für speichern höchstens 3.600 Sekunden:

from django.views.decorators.cache import cache_control 

@cache_control(must_revalidate=True, max_age=3600) 
def my_view(request): 
    # ... 

Wenn die Seite, die Sie Cachen häufig und Sie variiert wollen Um diese Änderungen sofort anzuzeigen (und den Cache nicht automatisch erkennen oder auf Änderungen prüfen), ohne auf den Cache-TTL zu warten, verwenden Sie cache_control.

Verwandte Themen