Django:缓存模板的两种方式:有什么区别?

时间:2014-09-02 18:20:47

标签: django templates caching

https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.cached.Loader

这里我们有“cached.Loader”来缓存模板

https://docs.djangoproject.com/en/dev/topics/cache/#template-fragment-caching

我们还有“模板碎片缓存”

我知道后者允许更好地控制缓存哪些部分。但如果我同时启用它们,它会为相同的片段消耗双倍的内存吗?

3 个答案:

答案 0 :(得分:3)

两种缓存机制并不相同。

模板片段缓存缓存渲染的模板,因此如果您首先访问此页面,

{% cache 500 welcome %}
Hello, {{ name }}
{% endcache %}

然后我在你之后访问了它,然后我也会看到'Hello timkung'。

这对缓存的模板加载器来说不是问题。它将编译后的模板缓存在内存中,这样可以避免Django从磁盘中获取文件并为每个请求编译它。但是,对于每个请求,模板仍会呈现一次。

请注意,模板片段缓存不一定将密钥存储在内存中,它取决于您使用的缓存(例如Memcached,db,file,...)

您可以同时使用这两种技术,当您向不同的用户显示不同的内容时,您只需要对模板缓存有点小心。

答案 1 :(得分:3)

Django模板引擎基本上有三个步骤:

  • 从文件系统加载模板文件
  • 将模板代码编译为python
  • 执行代码以输出纯文本(通常是HTML标记)。

cached.Loader只缓存前两个步骤:每次都不会加载和编译模板,但会执行。只要您使用线程安全模板标记,这就更快且通常是安全的。

片段缓存机制可以缓存最终输出:准备好呈现给用户的(静态)HTML标记。

因此,如果您需要渲染已缓存的模板片段,除了从缓存引擎中检索最终输出之外,不会进行任何计算。

由于您现在正在提供静态的,预先计算的内容,因此您可以确保将正确的数据提供给正确的用户:每个片段可以按用户,语言等进行缓存。

答案 2 :(得分:2)

  

默认情况下,模板系统会在每次需要渲染时读取和编译模板。虽然Django模板系统非常快,但读取和编译模板的开销可能会增加。

这意味着即使您使用模板片段缓存来缓存您的某个模板片段的输出,您仍然每次都在编译模板。即every_time_you_render = template.Template('template')

缓存的加载程序将一个实例存储在内存中。

模板片段缓存只是一种模板内缓存机制,用于计算其内容的输出并对其进行缓存,而不是重新呈现该块。

两者解决了完全不同的问题。例如,在我的一个网站上..我注意到编译我的模板(其中有很多用户驱动的动态包含)占用了大量的时间。缓存的加载器在这里节省了一天。

另一方面,如果模板内的计算是你的瓶颈,那么片段缓存或页面缓存通常会更有用。