2010-11-01 10 views
8

Django 1.2 introdujo un nuevo cargador de plantillas, que almacena datos en el caché (django.template.loaders.cached.Loader).Restablecimiento del caché para el cargador de plantillas en caché Django

Lamentablemente, no pude encontrar ninguna información sobre cómo se invalida la memoria caché y cuándo y cómo se restablece.

Quiero usar esto en mi servidor, pero no estoy seguro de que se reiniciara en django restart (eso sería suficiente para mí).

+0

oh, espera ... me acabo de dar cuenta - no usa memcached, ¿verdad? .. Por lo tanto, se restablece después de reiniciar django ... ¿estoy en lo cierto? – DataGreed

Respuesta

4

Al acceder a la fuente de django, puede encontrar que los cargadores de plantillas para la instancia actual del servidor se almacenan en django.template.loader.template_source_loaders.

Cuando utiliza el cargador en caché, solo hay un cargador por ahí. Entonces puede obtenerlo y llama a su función de reinicio para restablecer el caché de la plantilla.

Aquí hay algunos fragmentos de código, no lo he probado yo mismo.

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

Si marca django.template.loaders.cached, se puede ver que Django sólo tiene que utilizar una variable template_cache para mantener el nombre de la plantilla de caché ruta de plantilla. No usa memcached. Por lo tanto, debe reiniciarse cuando django reinicie.

+0

Gracias, acabo de descubrirlo. Por lo tanto, reiniciar el servidor django sería suficiente =) – DataGreed

+0

Lo hará funciona solo para el servidor de depuración cuando tiene un hilo y un proceso. En producción hay muchos hilos y procesos. No funcionará allí. – un1t

+0

no funciona con 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() 

hay que ir :)

1

Sólo esta solución funcionará garantizado, incluyendo entorno de producción, sin necesidad de reiniciar el servidor e incluso si usted está utilizando 'django.template.loaders.cached.Loader' backend:

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() 

Esta es explícita Importación absoluta, que se puede usar para aplicar parches a las variables globales. Puede estar seguro de que otras respuestas son incorrectas después de usar {% include 'some_template' %} etiqueta de plantilla (caché del 'some_template' no ser reseted después de usar loader.reset() donde loader es sólo iterador de template_source_loaders importado por la importación relativa.

He utilizado este método para la invalidación del plantillas de almacenamiento en la base de datos (creada por la biblioteca django-dbtemplates), y que se incluye en las plantillas normales por {% include %} etiqueta de plantilla.

Cuestiones relacionadas