11 Stimmen

Wie lösche ich ein zwischengespeichertes Template-Fragment in Django?

Zuvor hatte ich einen gecachten Abschnitt von HTML in meinem Django-Template wie folgt eingerichtet.

{% load cache %}            
    {% cache 10000 courseTable %}  {% endcache %}

Jetzt habe ich diesen gecachten Inhalt aktualisiert und möchte ihn aktualisieren. Ich habe versucht, die Zeit zu ändern, aber ohne Erfolg:

{% load cache %}            
    {% cache 0 courseTable %}  {% endcache %}

In diesem Fall wird immer noch das alte gecachte HTML auf der Seite angezeigt.

I habe auch versucht, die mit dem Caching verbundenen Template-Tags zu entfernen und wieder einzufügen. In diesem Fall kehrt der Inhalt jedoch nach dem Wiederherstellen der Cache-Template-Tags einfach zum ursprünglich gecachten Inhalt zurück.

Was kann ich tun? Ich möchte nicht ca. 2 Stunden warten, um meinen Cache neu zu laden.

14voto

Jordi Punkte 816

Für Django 1.6+ und aus der Django-Dokumentation können Sie einfach den Schlüssel des Teils generieren, den Sie suchen, und löschen:

from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

# Cache-Schlüssel für {% cache 500 sidebar Benutzername %} Templatetag
key = make_template_fragment_key('sidebar', [username])
cache.delete(key) # ungültigen zwischengespeicherten Template-Fragment

Sie müssen einfach make_template_fragment_key mit Ihrem zuvor definierten courseTable Argument aufrufen.

8voto

okm Punkte 23035

Wenn Sie sich leisten können, den gesamten Memcached zu leeren, führen Sie den Befehl flush_all aus oder einfach

from django.core.cache import cache
cache.clear()

Ansonsten müssen Sie den Cache-Schlüssel manuell generieren. Der timeout wird nicht aktualisiert, bis der Schlüssel abgelaufen ist.

2voto

David Sanders Punkte 3959

Bevor Django 1.6 hat das cache-Template-Tag seine Cache-Schlüssel mehr oder weniger im Körper der Tag-Definition erstellt (siehe hier). Ab Version 1.6 werden Cache-Schlüssel für Template-Fragmente mithilfe der Funktion django.core.cache.utils.make_template_fragment_key erstellt (siehe hier).

In jedem Fall können Sie ein bestimmtes zwischengespeichertes Fragment löschen, indem Sie make_template_fragment_key verwenden oder definieren, um den Cache-Schlüssel zu erhalten, wie folgt:

from __future__ import unicode_literals

import hashlib
from django.core.cache import cache
from django.utils.encoding import force_bytes
from django.utils.http import urlquote

TEMPLATE_FRAGMENT_KEY_TEMPLATE = 'template.cache.%s.%s'

def make_template_fragment_key(fragment_name, vary_on=None):
    if vary_on is None:
        vary_on = ()
    key = ':'.join(urlquote(var) for var in vary_on)
    args = hashlib.md5(force_bytes(key))
    return TEMPLATE_FRAGMENT_KEY_TEMPLATE % (fragment_name, args.hexdigest())

def delete_cached_fragment(fragment_name, *args):
    cache.delete(make_template_fragment_key(fragment_name, args or None))

delete_cached_fragment('my_fragment', 'other', 'vary', 'args')

Dieser Code stammt direkt aus dem Django-Codebase, daher gelten diese Lizenz- und Urheberrechtsbestimmungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X