Django - 如何判断一个模板片段是否已被缓存? [英] Django - how to tell if a template fragment is already cached?

查看:124
本文介绍了Django - 如何判断一个模板片段是否已被缓存?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Django的模板片段缓存所以在一个template.html文件中

  {%extends'base.html'%} 
{%load cache%
{%block content%}
{%cache 500myCacheKey%}
我的html这里...
{%endcache%}
{%endblock %}

这工作正常 - 我可以看到它正在缓存并点击,但视图正在做某事提供数据到这个视图是昂贵的,并且每次都被调用。



在views.py

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

那么如何判断缓存在调用api.getSomeExpensiveData()之前是否可用?



我无法使用cache.get('myCacheKey')作为缓存未找到 - d它使用一些命名方案,如果是这样,我可以使用类似于

  cache.get(cache.getTemplateFragmentKey(myCacheKey ))

  cache.getTemplateFragment(myCacheKey)


解决方案

如果您不在视图中使用该数据,则可能会很简单:

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

在模板中

  {%block content%} 
{%cache 500 myCacheKey%}
{{get_data.something}}
或者也可以
{%for get_data%}
{%endfor%}
{%endcache %}
{%endblock%}

Django模板自动调用所有可调用对象。 p>

编辑:



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


I am using Django's Template Fragment Caching so in a template.html file

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

This is working fine - I can see it's getting cached and hit but the view is doing something expensive to provide data to this view and thats getting called every time.

In views.py

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

So how do I tell if the cache is avail before the call to api.getSomeExpensiveData()?

I can't use cache.get('myCacheKey') as the cache isn't found - does it use some naming scheme and if so can I either use something like

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

or

cache.getTemplateFragment("myCacheKey")

解决方案

If you do not use that data in your view, something as simple as this might work:

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

In template

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

Django template automatically calls all callable objects.

EDIT:

If you need to use get_data more than once in your template you'll need some wrapper. Something similar to this:

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

这篇关于Django - 如何判断一个模板片段是否已被缓存?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆