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

标签 django django-templates python-import

我有大量自定义模板标签,它们执行各种功能,包括:

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

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

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

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

如果这个问题中有错误的假设或前提,我深表歉意。我希望更好地理解导入 python 代码的一般含义,或者具体在 Django 环境中的含义。

最佳答案

对于 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 ),这不呈现任何内容——因此就目前而言,实际上并没有考虑性能。

关于django - Django 是否缓存自定义标签和过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636032/

相关文章:

python - 需要 PEP 302 实现细节

python - 当主脚本在子模块中时正确初始化 sys.path

python - Django 1.10错误, 'NoneType'对象不可调用

python - 'reload'的递归版本

python - 获取 'str' 对象在 Django 中没有属性 'get'

python - 应用过滤器后引用 django-templates 中的键/值

python - 如何将秒转换为 hh :mm:ss with the Django's date template tag?

python - NoReverseMatch at/polls/〉为什么第0行会出错?

python - Django Slugfield 删除文章 ('the' 、 'a' 、 'an' 、 'that' )

python - 启用 django-extensions 和 pygraphviz