Django - 如何判断模板片段是否已被缓存?

时间:2011-01-27 20:10:32

标签: python django google-app-engine

我正在使用Django的Template Fragment Caching所以在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.getSomeExpensiveData()之前如何判断缓存是否可用?

我无法使用cache.get('myCacheKey'),因为找不到缓存 - 它是否使用了一些命名方案,如果是这样,我可以使用像

这样的东西
cache.get(cache.getTemplateFragmentKey("myCacheKey"))

cache.getTemplateFragment("myCacheKey")

2 个答案:

答案 0 :(得分:5)

如果您不在视图中使用该数据,那么这样简单的事情可能会起作用:

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模板自动调用所有可调用对象。

编辑:

如果您需要在模板中多次使用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()} )

答案 1 :(得分:0)

我发现了SO - How do I access template cache?

并将其改编为

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)

编辑 - 我已经接受了skirmantas的答案,因为尽管这样做的确比较好,因为模板和视图更加松散耦合。使用此方法,您需要知道每个缓存片段的名称以及在哪里使用的。设计师会移动一些东西,它会倒下。