【问题标题】:Does Django cache custom tags and filters?Django 是否缓存自定义标签和过滤器?
【发布时间】:2015-09-17 17:01:23
【问题描述】:

我有相当多的自定义模板标签,它们执行各种功能,包括:

  • 简单的字符串转换
  • 复杂 ui 元素的显示
  • 时间戳操作和格式化
  • 用户头像的处理和显示
  • 等等...

所有这些功能都位于一个文件中app/templatetags/custom_tags.py。当我想在模板中使用其中一个标签时,我使用{% load custom_tags %} 导入所有标签。

然而,在任何给定模板中实际使用的可用标签中只有一小部分。 换句话说,所有这些功能都被“加载”到模板中,但其中只有少数几个在特定的 Web 请求中调用。

  • 就性能而言,这是否效率低下?我是否应该更保守地加载代码 - 即将我的自定义标签拆分为单独的文件并仅加载我需要的子集?
  • 或者这无关紧要,因为所有标签都加载到内存中 - 即,随后在应用程序的其他位置调用 {% load custom_tags %} 不会导致任何额外开销?

如果这个问题有不正确的假设或前提,我深表歉意。我很想更好地理解导入 python 代码的含义,或者特别是在 Django 环境中。

【问题讨论】:

  • 您应该将标题编辑为特定的内容,例如“Django 是否缓存自定义标签和过滤器?”当前的标题听起来是基于意见的,可能会受到负面影响。
  • @approxiblue,非常感谢您的建议。部分问题肯定是我不知道如何正确提问。
  • 你看过this pages吗,也许它可以帮助你回答你的问题!

标签: django django-templates python-import


【解决方案1】:

对于 Django

load 标签定义为here,实际上是在加载herehere。这两个地方都调用get_library,定义为here。根据那里的文档字符串yes,它将模板标签/过滤器库缓存在字典初始化here中的同一进程中。

对于 Django 1.9:

模板标签的模块are now being loaded even earlier,当解析器被实例化时,库被直接存储on the parser。加载标签调用 find_library herehere,这只是 gets the already-loaded tag directly from the parser

除了实际的加载活动

正如@spectras 在下面指出的那样,无论 Django 版本如何,严格来说,标签的加载行为都是副作用,并且标签返回(<=1.8/1.9)一个无操作节点(@987654334 @/1.9),它不呈现任何内容——所以就这一点而言,并没有真正考虑性能。

【讨论】:

  • 您链接到特定 git 分支上的行/文件(例如 stable/1.8.x)。 Django 开发人员会为他们做出更多承诺,您的参考资料将变得不准确。您应该链接到 git 标签上的行/文件。
  • 您还应该添加在初始解析后处理load 标记的实际点:LoadNode,它只是一个空的、无操作的节点。
  • @approxiblue 好电话。一切就绪。
  • @spectras 为了完整起见添加。
  • 确实如此。您可以从收集的所有 ryanmrubin 中得出结论,您的自定义标签的组织对您的网站性能没有影响。每个库将只加载一次,无论是第一次使用还是启动服务器时,都取决于 Django 版本。如果使用诸如 uwsgi 之类的多进程服务器,每个进程会发生一次(然后每个进程将服务数千个请求而不会降低性能)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2021-11-24
  • 2012-12-22
  • 2013-08-24
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多