禁用某些过滤器的Jinja模板缓存

时间:2013-12-18 09:32:35

标签: jinja2

我们有一个自定义的Jinja过滤器,用于为我们的Javascript和CSS资源创建缓存清除URL。我们现在注意到,在我们的生产环境中,最终的编译模板会被缓存。这会导致问题,因为我们的模板过滤器有时不会创建新的URL(即模板未更改,但Javascript是)。

有没有办法迫使Jinja每次重新评估某个过滤器并且不会缓存结果?

编辑1 :我们正在使用常量输入(文件名)到过滤器。

4 个答案:

答案 0 :(得分:6)

经过大量的谷歌搜索,我终于找到了真正的解决方案。 Jinja有一个名为contextfilter的特殊帮助器,您可以使用它来装饰您的函数,以使您的过滤器具有上下文感知能力(以及依赖于上下文)。即使将常量作为输入传递,Jinja字节码缓存也不会缓存此计算值。

在Python的过滤器中:

from jinja2 import contextfilter

@contextfilter
def asset_url(context, url):
    return some_url_thing(url)

在你的模板中:

<link rel="stylesheet" href="{{ 'styles.css' | asset_url }}" />

答案 1 :(得分:3)

有一种方法可以禁用特定过滤器结果的缓存:它是由而不是使用常量输入,例如通过将随机源暴露为全局变量。

# Expose to Jinja
from random import random as RANDOM

在模板中

{{ RANDOM() | eval_this_filter_every_time }}

答案 2 :(得分:2)

可以使用cache_size设置配置Jinja2的缓存行为:http://jinja.pocoo.org/docs/api/#jinja2.Environment

但是,这只会缓存模板本身。只要过滤器的输入是可变的,输出也是可变的。

那么......你是如何使用过滤器的?你可以发布模板的一部分和正在缓存的过滤器吗?

答案 3 :(得分:0)

最简单的方法是:

在烧瓶服务器脚本上执行以下操作:

from time import ctime

在您的app.route()函数中,

在返回行中添加:

time=ctime()

例如:

return render_template('signup', error = error, time = ctime())

在您的CSS文件的html参考中(如果使用jinja2)添加:

?{{time}}

在参考行的末尾。

应该像这样:

<link rel="stylesheet" href="{{ url_for('static', filename='css/base.css')}}?{{time}}">

对我来说工作得很好,浏览器停止了缓存。

希望对您有帮助!

干杯!

-Nelio