我有大量自定义模板标签,它们执行各种功能,包括:
- 简单的字符串转换
- 复杂 UI 元素的显示
- 时间戳操作和格式化
- 处理和显示用户头像
- 等等...
所有这些函数都驻留在一个文件中:app/templatetags/custom_tags.py
。当我想在模板中使用这些标签之一时,我使用 {% load custom_tags %}
导入所有标签。 。
但是,在任何给定模板中实际上只使用了可用标记的一小部分。换句话说,所有这些功能都被“加载”到模板中,但只有其中的一小部分在特定的 Web 请求中调用。
- 就性能而言,这是否效率低下?我是否应该更保守地加载代码 - 即,将我的自定义标签分成单独的文件并仅加载我需要的子集?
- 或者这并不重要,因为所有标签都加载到内存中 - 即后续调用
{% load custom_tags %}
应用程序其他地方不会导致任何额外的开销吗?
如果这个问题中有错误的假设或前提,我深表歉意。我希望更好地理解导入 python 代码的一般含义,或者具体在 Django 环境中的含义。
最佳答案
对于 Django <= 1.8:
load
标签定义为 here ,实际上加载 here 和 here 。两个地方都调用 get_library
,定义为 here 。根据那里的文档字符串 yes ,它在初始化的字典 here 中的同一进程中缓存模板标签/过滤器库。
对于 Django 1.9:
实例化解析器时模板标签 are now being loaded even earlier 的模块,并且库直接存储在 on the parser 中。加载标签调用 find_library
here 和 here ,即 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/