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

2 投票
2 回答
1812 浏览
提问于 2025-04-16 10:44

我正在使用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.getSomeExpensiveData()之前判断缓存是否可用呢?

我不能使用cache.get('myCacheKey'),因为找不到缓存——它是否使用了一些命名规则?如果是这样,我能否使用类似的东西

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

或者

cache.getTemplateFragment("myCacheKey")

2 个回答

0

我找到了一篇关于如何访问模板缓存的文章,链接在这里: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)

编辑 - 我接受了skirmantas的回答,因为虽然这个方法完全满足了要求,但它是更好的做法,这样模板和视图之间的联系就不那么紧密了。使用这种方法,你需要知道每个缓存片段的名称以及它们的用途。如果设计师调整了东西,可能就会出问题。

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

撰写回答