2010-11-01 4 views
8

Django 1.2 a introduit un nouveau chargeur de gabarits, qui stocke les données dans le cache (django.template.loaders.cached.Loader).Réinitialisation du cache pour le chargeur de gabarit en cache de Django

Malheureusement, j'ai échoué à trouver des informations sur la façon dont le cache est invalidé et quand et comment il est réinitialisé. Je veux utiliser ceci sur mon serveur, mais je ne suis pas sûr, qu'il serait réinitialisé sur le redémarrage de django (ce serait assez pour moi).

+0

oh, attendez ... je viens de réaliser - il n'utilise pas memcached, non? .. Donc, il se réinitialise après le redémarrage de django ... ai-je raison? – DataGreed

Répondre

4

En creusant dans la source de django, vous pouvez trouver les chargeurs de gabarits pour l'instance de serveur en cours à django.template.loader.template_source_loaders. Lorsque vous utilisez un chargeur mis en cache, il n'y aurait qu'un seul chargeur. Donc, vous pouvez l'obtenir et appelle sa fonction de réinitialisation pour réinitialiser le cache de modèle.

Voici quelques extraits de code, je ne l'ai pas testé moi-même.

from django.template.loader import template_source_loaders 
loader = template_source_loaders[0] 
loader.reset() 

Si vous cochez django.template.loaders.cached, vous pouvez voir que django utiliser simplement une variable template_cache pour tenir le nom du modèle de cache de chemin du modèle. Il n'utilise pas memcached. Donc, il devrait être réinitialisé lorsque django redémarre.

+0

Thanx, je viens de le découvrir moi-même, donc redémarrer le serveur django serait suffisant =) – DataGreed

+0

ne fonctionne que pour le serveur de débogage lorsque vous avez un thread et un processus. Sur la production sont de nombreux threads et processus. Ça ne marchera pas là-bas. – un1t

+0

ne fonctionne pas avec django 1.9.9 – patroqueeet

4
from django.template.loader import template_source_loaders 

def reset_template_cache(): 
    if not template_source_loaders: 
     return 

    for loader in template_source_loaders: 
     loader.reset() 

Il vous allez :)

1

Seule cette solution fonctionnera garantie, y compris l'environnement de production, sans redémarrage du serveur et même si vous utilisez 'django.template.loaders.cached.Loader' back-end:

import django.template.loader 

def reset_template_cache(): 
    if django.template.loader.template_source_loaders: 
     for t in django.template.loader.template_source_loaders: 
      t.reset() 

C'est explicite Importation absolue, qui peut être utilisée pour patcher des variables globales. Vous pouvez être sûr que d'autres réponses sont erronées après l'utilisation {% include 'some_template' %} étiquette de modèle (cache du 'some_template' pas reseted après avoir utilisé loader.reset()loader est juste iterator de template_source_loaders importés par l'importation relative.

J'ai utilisé cette méthode pour infirmation les modèles de stockage dans la base de données (créé par django-dbtemplates bibliothèque), et qui inclus dans les gabarits normaux par étiquette de modèle

Questions connexes