Django - как определить, что фрагмент шаблона уже кэширован? - PullRequest
2 голосов
/ 27 января 2011

Я использую Django Кэширование фрагментов шаблона , поэтому в файле template.html

{% extends 'base.html' %}
{% load cache %}
{% block content %}
  {% cache 500 "myCacheKey" %}
     My html here...
  {% endcache %}
{% endblock %}

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

В views.py

def index(request)
   data = api.getSomeExpensiveData()
   return render_to_response('template.html', {'data':data} )

Итак, как мне узнать, доступен ли кэш перед вызовом api.getSomeExорогоData ()?

Я не могу использовать cache.get ('myCacheKey'), так как кеш не найден - использует ли он какую-либо схему именования, и если да, могу ли я использовать что-то вроде

cache.get(cache.getTemplateFragmentKey("myCacheKey"))

или

cache.getTemplateFragment("myCacheKey")

Ответы [ 2 ]

5 голосов
/ 27 января 2011

Если вы не используете эти данные в своем представлении, может сработать что-то простое:

def index(request)
   get_data = api.getSomeExpensiveData
   return render_to_response('template.html', {'get_data':get_data} )

В шаблоне

{% block content %}
  {% cache 500 "myCacheKey" %}
     {{ get_data.something }}
     Or maybe
     {% for something in get_data %}
     {% endfor %}
  {% endcache %}
{% endblock %}

Шаблон Django автоматически вызывает все вызываемые объекты.

EDIT:

Если вам нужно использовать get_data более одного раза в вашем шаблоне, вам понадобится обертка. Нечто похожее на это:

def index(request)
   class get_data(object):
       data = False
       def __call__(self):
           if not self.data:
               self.data = api.getSomeExpensiveData()
           return self.data
   return render_to_response('template.html', {'get_data':get_data()} )
0 голосов
/ 27 января 2011

Я нашел это SO - Как получить доступ к кэшу шаблонов?

И адаптировал его к

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

def hasFragmentCache(key, variables = []):
    hash = md5_constructor(u':'.join([urlquote(var) for var in variables]))    
    return cache.has_key(cache_key)

Редактировать - я принял ответ скирмантаса, так как он делает то же самое, что и заданный, лучший подход, так как шаблон и представление более слабо связаны. Используя этот метод, вам нужно знать имя каждого фрагмента кеша и что использовалось где. Дизайнер перемещает вещи, и они падают.

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