【问题标题】:Django : Two ways of caching template : What is the difference?Django:两种缓存模板的方式:有什么区别?
【发布时间】:2014-10-27 02:22:26
【问题描述】:

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

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

我知道后者可以更好地控制要缓存的部分。但是如果我同时启用这两个,它会为相同的片段消耗双倍的内存吗?

【问题讨论】:

    标签: django templates caching


    【解决方案1】:

    这两种缓存机制并不等同。

    模板片段缓存缓存渲染的模板,所以如果你先访问了这个页面,

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

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

    这不是缓存模板加载器的问题。它将编译后的模板缓存在内存中,这使 Django 无需从磁盘中获取文件并为每个请求编译它。但是,模板仍然会为每个请求渲染一次。

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

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

    【讨论】:

    • 文档提到,在这种情况下,您使用这样的标签:{% cache 500 sidebar request.user.username %},请参阅 django 文档中的“模板片段缓存”。
    【解决方案2】:

    Django 模板引擎基本上需要执行三个步骤:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      缓存的加载器在内存中存储一​​个实例。

      模板片段缓存只是一种模板内缓存机制,用于计算其内容的输出并将其缓存,而不是重新渲染该块。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-09
        • 2019-10-28
        • 1970-01-01
        相关资源
        最近更新 更多