Сброс кеша для загрузчика кешированных шаблонов Django - PullRequest
8 голосов
/ 01 ноября 2010

Django 1.2 представил новый загрузчик шаблонов, который хранит данные в кэше (django.template.loaders.cached.Loader).

К сожалению, мне не удалось найти какую-либо информацию о том, как кэш-память аннулирована, когда и как она сбрасывается.

Я хочу использовать это на моем сервере, но я не уверен, что он перезагрузится при перезапуске django (этого мне будет достаточно).

Ответы [ 3 ]

4 голосов
/ 03 февраля 2014
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()

Вот, пожалуйста:)

4 голосов
/ 01 ноября 2010

Перейдя к исходному тексту django, вы можете обнаружить, что загрузчики шаблонов для текущего экземпляра сервера хранятся в django.template.loader.template_source_loaders.

Когда вы используете кэшированный загрузчик, там будет только один загрузчик. Таким образом, вы можете получить его и вызвать функцию сброса для сброса кэша шаблона.

Вот некоторые фрагменты кода, я сам не проверял.

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

Если вы отметите django.template.loaders.cached, вы увидите, что django просто использует одну переменную template_cache для хранения имени шаблона в кэше пути шаблона. Он не использует memcached. Поэтому он должен быть сброшен при перезагрузке django.

1 голос
/ 29 сентября 2015

Только это решение будет работать гарантированно, включая производственную среду, без перезапуска сервера и даже если вы используете '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()

Это явный абсолютный импорт, который можно использовать для исправления глобальных переменных. Вы можете быть уверены, что другие ответы неверны после использования тега шаблона {% include 'some_template' %} (кеш 'some_template' не может быть сброшен после использования loader.reset(), где loader - просто итератор template_source_loaders, импортированный путем относительного импорта.

Я использовал этот метод для аннулирования шаблонов, хранящихся в базе данных (созданной библиотекой django-dbtemplates ) и включенных в обычные шаблоны с помощью тега {% include %} template.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...