【问题标题】:Is there a performance hit for Django tags using takes_context?使用 take_context 对 Django 标签有性能影响吗?
【发布时间】:2012-10-08 19:06:54
【问题描述】:

我有时通过为 Django 标签提供“takes_context=True”来访问上下文;通常用于访问请求。

但是否存在性能影响。

我对模板如何工作的心智模型是标签函数组装代表模板的节点,然后这些节点可以在不重新创建节点或重新解析模板的情况下呈现内容。

但是可以肯定的是,如果可以使标记函数返回不同的节点,则取决于 上下文中的某些内容,那么每次上下文不同时(即每次)都必须重新创建节点。

要么是这样,要么您被第一次获得的节点所困扰,在这种情况下,您不应该根据上下文中的任何内容返回节点(在这种情况下,有什么意义?)。

有人可以帮我解决这个问题吗?我使用 Django 1.4.2。

【问题讨论】:

    标签: django performance templates render nodes


    【解决方案1】:

    加载模板时会创建节点。当它被渲染时,上下文被简单地传递给节点的渲染方法。 simple_tagtakes_context 参数的唯一区别是使生成的 Node.render 代码将上下文传递给您的函数。所以不,使用takes_context 不会影响性能。

    【讨论】:

    • 这是否意味着所有已定义的节点类都已创建?即使没有标签使用它?
    • 是在加载包含它们的模块时创建的。据我所知,在解析模板时遇到{% load xxx %} 时会发生这种情况。节点 instances 是在模板加载/解析过程中遇到相应标签时创建的。
    • 我假设仅当标签使用该节点时才创建实例?
    • 抱歉,“标签使用该节点”是什么意思?一个标签总是使用它自己的节点。如果您的意思是“仅当模板使用该标签时”,那么是的,那是真的。
    • 我的意思是如果标签的形式是“如果 X 则返回 SomeNodeA() 否则返回 SomeNodeB()”。一个标签可以有条件地返回任何节点;我假设该节点仅在第一次实际使用时才被实例化?
    猜你喜欢
    • 2011-11-12
    • 2014-01-05
    • 2018-03-09
    • 2014-04-13
    • 1970-01-01
    • 2019-11-04
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多