Jinja: 导入的模板缓存时间过长

创建于 2013-07-16  ·  4评论  ·  资料来源: pallets/jinja

我有一个名为 main.html 的模板。 它{% 导入 %} 一个名为 module_a 的模块(没有上下文)。 module_a {% imports %} module_b 以同样的方式。

当我更改 module_a 时,模板加载器会识别并重新加载它。

当我更改 module_b 时,模板加载器无法识别它。 我必须重新启动该过程。

我相信这是因为 module_a 的生成代码在其 root() 函数中进行了导入。 get_template 看到 module_a 是最新的,因此不会重新加载它,因此不会重新运行它的 root() 函数。

我不确定如何解决这个问题。 显然,在每次调用 get_template 时调用 root() 是不好的。 最完整的解决方案是跟踪每个模板的依赖关系,但这是很多工作。

最有用的评论

问题是导入被缓存但没有被跟踪。 我不确定处理这个问题的最佳方法是什么。

所有4条评论

我们也遇到了这个问题。 (我几乎没有发现这个错误,因为您没有使用术语auto_reload - 这仅在auto_reload=True时才相关)。

看起来这很难解决; 理想情况下,您希望从get_source返回的uptodate方法不仅可以检查源文件本身,还可以检查它导入、扩展或包含的任何源文件。 但是在定义uptodate时,您所拥有的只是未解析的原始源,因此该信息不可用。

它可能可以在更高级别上实现(例如在Template.is_up_to_date中),但这似乎也需要进行重大手术才能从编译器中获取依赖信息。

我也遇到了这个。 这在开发中非常烦人,因为这意味着我必须将cache_size设置为 0,然后事情变得非常缓慢(正如人们所预料的那样)。

我会尝试挖掘内部结构,看看我是否想出了一些东西。 同时,如果有更多经验的人可以提出解决方案甚至是一些方向,那将是非常棒的!

问题是导入被缓存但没有被跟踪。 我不确定处理这个问题的最佳方法是什么。

好的,所以这里的问题不在于模板的缓存,而是传递给导入宏的变量的缓存。
(至少在我的情况下)

我的解决方法是使用一种方法来返回要呈现的更新的上下文值。

在我的场景中,我正在为分页制作一个宏。 宏需要请求对象。

宏观内的初始方法
{% set pagenum, limit = request.args.pg , request.args.limit %}
这最初会起作用,但在后续请求中,宏上下文值将被永久缓存,除非服务器重新启动

宏观内的工作方法
{% set pagenum, limit = request.get_params() %}
现在,这将在每次调用时返回我更新的请求参数,而不会牺牲我的宏缓存。

我还注意到缓存宏会使我的响应时间加快约 2.5 倍。
没有缓存 ~= 450ms
使用缓存 ~= 150ms

此页面是否有帮助?
0 / 5 - 0 等级