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

标签 jinja2

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

有没有办法强制 Jinja 每次重新评估某个过滤器而不缓存结果?

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

最佳答案

经过大量的谷歌搜索,我终于找到了真正的解决方案。 Jinja有一个特殊的 helper 叫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 }}" />

关于jinja2 - 禁用某些过滤器的 Jinja 模板缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654274/

相关文章:

jinja2 - 如何在 Ansible 值中格式化变量

python - 无法使用 jinja2 加载模板

python - 在 Knockout attr 绑定(bind)下使用 Jinja2 模板

python - Flask + python + jinja2 : how can I partialy replace template arguments with html code?

python - 将 Flask 应用程序部署到 Heroku - 找不到模板

templates - 根据组更改 Ansible 模板中的变量

python-2.7 - Ruamel.yaml.jinja2 : typ "jinja2"not recognised on CentOS

ansible - 有条件地将参数添加到 argv

flask - Jinja - 在 for 循环中显示两个不同的值

templates - 使用 Jinja2,是否可以禁用标签和/或过滤器?