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
我们还有“模板碎片缓存”
我知道后者允许更好地控制缓存哪些部分。但如果我同时启用它们,它会为相同的片段消耗双倍的内存吗?
答案 0 :(得分:3)
两种缓存机制并不相同。
模板片段缓存缓存渲染的模板,因此如果您首先访问此页面,
{% cache 500 welcome %}
Hello, {{ name }}
{% endcache %}
然后我在你之后访问了它,然后我也会看到'Hello timkung'。
这对缓存的模板加载器来说不是问题。它将编译后的模板缓存在内存中,这样可以避免Django从磁盘中获取文件并为每个请求编译它。但是,对于每个请求,模板仍会呈现一次。
请注意,模板片段缓存不一定将密钥存储在内存中,它取决于您使用的缓存(例如Memcached,db,file,...)
您可以同时使用这两种技术,当您向不同的用户显示不同的内容时,您只需要对模板缓存有点小心。
答案 1 :(得分:3)
Django模板引擎基本上有三个步骤:
cached.Loader
只缓存前两个步骤:每次都不会加载和编译模板,但会执行。只要您使用线程安全模板标记,这就更快且通常是安全的。
片段缓存机制可以缓存最终输出:准备好呈现给用户的(静态)HTML标记。
因此,如果您需要渲染已缓存的模板片段,除了从缓存引擎中检索最终输出之外,不会进行任何计算。
由于您现在正在提供静态的,预先计算的内容,因此您可以确保将正确的数据提供给正确的用户:每个片段可以按用户,语言等进行缓存。
答案 2 :(得分:2)
默认情况下,模板系统会在每次需要渲染时读取和编译模板。虽然Django模板系统非常快,但读取和编译模板的开销可能会增加。
这意味着即使您使用模板片段缓存来缓存您的某个模板片段的输出,您仍然每次都在编译模板。即every_time_you_render = template.Template('template')
。
缓存的加载程序将一个实例存储在内存中。
模板片段缓存只是一种模板内缓存机制,用于计算其内容的输出并对其进行缓存,而不是重新呈现该块。
两者解决了完全不同的问题。例如,在我的一个网站上..我注意到编译我的模板(其中有很多用户驱动的动态包含)占用了大量的时间。缓存的加载器在这里节省了一天。
另一方面,如果模板内的计算是你的瓶颈,那么片段缓存或页面缓存通常会更有用。