多次加载 Django 静态标签会影响性能
Performance hits from loading Django static tag multiple times
除非我做错了,否则似乎如果你有嵌套模板(即 {% include %}
模板中的模板),你有时需要在多个 "layers"的巢穴。例如,假设我有 templateA.html
:
{% load static %}
<a href={% static "some/path" %}>Some Link</a>
{% include 'templateB.html' %}
然后在`templateB.html中,我有:
{% load static %}
<a href={% static "some/other/path" %}>Some Other Link</a>
据我从测试中得知,我必须在两个模板中都包含 {% load static %}
,因为 templateB.html
不知道我已经加载了 {% static %}
标签。
我的问题是:
假设需要加载 {% static %}
标记两次(或更多次,具体取决于嵌套量),这种额外加载是否会影响性能?
我不确定加载此标记时 Django 在幕后做了什么,但我的直觉是您不想加载和重新加载静态文件。 (由于我们谈论的是一个开源项目,我实际上 尝试 亲自研究了这个 templatetag
是如何实现的,但事实证明它有点超出我的理解...)。
另外,这个问题假设有必要始终以这种方式加载标签。如果有什么我想念的,我会非常有兴趣了解更多。谢谢!
没有开销。 load static
没有 "load and reload static files";它只是使 staticfiles templatetags 库中的(已经加载的)代码在您的模板中可用。
您必须在每个模板中写入标签。在性能方面,您不必担心,因为它永远不会重新加载或加载静态文件的单独新副本。
通过使用加载,您可以将某些应用程序中的标签和过滤器添加到当前模板的上下文中。它只是为解析器调用 parser.add_library()
并更新此特定模板的标签和过滤器列表。您可以查看 this method, and it gets called from load tag
如果您不想加载某些内容,可以将其添加到内置函数中。对于 Django 1.9,你可以像这样配置它
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'builtins': ['django.templatetags.static'],
},
},
]
以及旧版本
from django.template.loader import add_to_builtins
add_to_builtins('django.templatetags.static')
除非我做错了,否则似乎如果你有嵌套模板(即 {% include %}
模板中的模板),你有时需要在多个 "layers"的巢穴。例如,假设我有 templateA.html
:
{% load static %}
<a href={% static "some/path" %}>Some Link</a>
{% include 'templateB.html' %}
然后在`templateB.html中,我有:
{% load static %}
<a href={% static "some/other/path" %}>Some Other Link</a>
据我从测试中得知,我必须在两个模板中都包含 {% load static %}
,因为 templateB.html
不知道我已经加载了 {% static %}
标签。
我的问题是:
假设需要加载 {% static %}
标记两次(或更多次,具体取决于嵌套量),这种额外加载是否会影响性能?
我不确定加载此标记时 Django 在幕后做了什么,但我的直觉是您不想加载和重新加载静态文件。 (由于我们谈论的是一个开源项目,我实际上 尝试 亲自研究了这个 templatetag
是如何实现的,但事实证明它有点超出我的理解...)。
另外,这个问题假设有必要始终以这种方式加载标签。如果有什么我想念的,我会非常有兴趣了解更多。谢谢!
没有开销。 load static
没有 "load and reload static files";它只是使 staticfiles templatetags 库中的(已经加载的)代码在您的模板中可用。
您必须在每个模板中写入标签。在性能方面,您不必担心,因为它永远不会重新加载或加载静态文件的单独新副本。
通过使用加载,您可以将某些应用程序中的标签和过滤器添加到当前模板的上下文中。它只是为解析器调用 parser.add_library()
并更新此特定模板的标签和过滤器列表。您可以查看 this method, and it gets called from load tag
如果您不想加载某些内容,可以将其添加到内置函数中。对于 Django 1.9,你可以像这样配置它
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'builtins': ['django.templatetags.static'],
},
},
]
以及旧版本
from django.template.loader import add_to_builtins
add_to_builtins('django.templatetags.static')