Django 是否缓存自定义标签和过滤器?

tin*_*ino 4 django django-templates python-import

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

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

所有这些函数都驻留在一个文件中app/templatetags/custom_tags.py. 当我想在模板中使用这些标签之一时,我使用{% load custom_tags %}.

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

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

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

rya*_*bin 5

对于 Django <= 1.8:

load标签被定义在这里并实际执行加载在这里这里。两个地方都调用到get_library在此处定义。根据那里的文档字符串,是的,它在此处初始化的字典中的同一进程中缓存模板标记/过滤器库。

对于 Django 1.9:

模板标签的模块现在被更早地加载,当解析器被实例化时,库被直接存储在解析器上。加载标签调用find_library herehere,它只是直接从解析器获取已经加载的标签

除了实际的加载活动

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