Django - 如何判断模板片段是否已缓存?
我正在使用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()} )