Как можно явно сбросить кэш фрагмента шаблона в Django?

#django #django-templates #django-cache #python-memcached

#django #django-шаблоны #django-cache #python-memcached

Вопрос:

Я использую Memcache для своего приложения Django.

В Django разработчики могут использовать кэширование фрагмента шаблона только для кэширования раздела шаблона. https://docs.djangoproject.com/en/dev/topics/cache/#template-fragment-caching

Мне было интересно, есть ли способ явно изменить значение раздела кэша фрагмента шаблона, скажем, в views.py . Например, можно ли использовать метод, похожий на cache.set («боковая панель», «новое значение»), за исключением кэша фрагмента шаблона?

Спасибо за вашу помощь.

Ответ №1:

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

 from django.utils.hashcompat import md5_constructor
from django.utils.http import urlquote

def template_cache_key(fragment_name, *vary_on):
    """Builds a cache key for a template fragment.

    This is shamelessly stolen from Django core.
    """
    base_cache_key = "template.cache.%s" % fragment_name
    args = md5_constructor(u":".join([urlquote(var) for var in vary_on]))
    return "%s.%s" % (base_cache_key, args.hexdigest())
  

Затем вы могли бы сделать что-то вроде cache.set(template_cache_key(sidebar), 'new content') , чтобы изменить это.

Однако делать это в представлении довольно некрасиво. Имеет больше смысла настраивать сигналы после сохранения и удалять записи кэша при изменении моделей.

Приведенный выше фрагмент кода работает для Django 1.2 и ниже. Я не уверен в совместимости с Django 1.3 ; django/templatetags/cache.py будет самая свежая информация.

Для Django 1.7, django/core/cache /utils.py имеет полезную функцию.

Комментарии:

1. @SimonSteinberger: Да, вам придется его немного изменить; либо скопируйте, либо используйте функцию отсюда: github.com/django/django/blob/master/django/core/cache/utils.py

2. Только что узнал, для этого есть документированная функция: docs.djangoproject.com/en/dev/topics/cache /…