我们有一个自定义的Jinja过滤器,用于为我们的Javascript和CSS资源创建缓存清除URL.我们现在注意到,在我们的生产环境中,最终的编译模板会被缓存.这会导致问题,因为我们的模板过滤器有时不会创建新的URL(即模板未更改但Javascript是).
有没有办法迫使Jinja每次都重新评估某个过滤器并且不缓存结果?
编辑1:我们使用常量输入(文件名)到过滤器.
小智 6
经过大量的谷歌搜索,我终于找到了真正的解决方案.Jinja有一个名为contextfilter的特殊帮助器,您可以使用它来装饰您的函数,以使您的过滤器具有上下文感知能力(以及依赖于上下文).即使将常量作为输入传递,Jinja字节码缓存也不会缓存此计算值.
在Python中的过滤器中:
from jinja2 import contextfilter
@contextfilter
def asset_url(context, url):
return some_url_thing(url)
Run Code Online (Sandbox Code Playgroud)
在您的模板中:
<link rel="stylesheet" href="{{ 'styles.css' | asset_url }}" />
Run Code Online (Sandbox Code Playgroud)
Jinja2 的缓存行为可以使用以下cache_size设置进行配置:http ://jinja.pocoo.org/docs/api/#jinja2.Environment
但是,这仅缓存模板本身。只要过滤器的输入是可变的,输出也将是可变的。
那么...您如何使用过滤器?您可以发布模板部分和正在缓存的过滤器吗?