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

时间:2015-09-17 17:01:23

标签: django django-templates python-import

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

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

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

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

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

如果此问题中存在错误的假设或前提,我道歉。我希望能够更好地理解导入python代码的含义,特别是在Django环境中。

1 个答案:

答案 0 :(得分:3)

对于Django< = 1.8:

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)一个无操作节点(<=1.8 / 1.9),它没有任何内容 - 因此,就此而言,并不是真正的性能考虑因素。