我们有一个自定义的Jinja过滤器,用于为我们的Javascript和CSS资源创建缓存清除URL。我们现在注意到,在我们的生产环境中,最终的编译模板会被缓存。这会导致问题,因为我们的模板过滤器有时不会创建新的URL(即模板未更改,但Javascript是)。
有没有办法迫使Jinja每次重新评估某个过滤器并且不会缓存结果?
编辑1 :我们正在使用常量输入(文件名)到过滤器。
答案 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