0

我正在使用模板编写散景服务器应用程序。我添加了一些自定义 CSS 和 JS 文件。但是当我进行一些更改时,文件会从缓存中重新加载,我看不到新的更改。一种解决方案是在 URL 的末尾添加一个变量,以便在有一些更改时从头开始加载它们。散景资源就是这样工作的。

到目前为止,我已经添加了本示例中的资源

{% extends base %}

<!-- goes in head -->
{% block preamble %}
    <link href="app/static/css/custom.min.css" rel="stylesheet">
    <script type="text/javascript" src="app/static/js/custom.min.js"></script>
{% endblock %}

<!-- goes in body -->
{% block contents %}
    <div> {{ embed(roots.scatter) }} </div>
    <div> {{ embed(roots.line) }} </div>
{% endblock %}

有没有内置的方法来添加这些哈希?我想要的结果是:

<link href="app/static/css/custom.min.css?v=f5ee62ee57a37d94c35e8f7be218e11fc63df459" rel="stylesheet">

必须在页面加载之前添加此哈希字符串才能使其正常工作

我找到了这个类,但它似乎只适用于 Bokeh 资源

4

1 回答 1

1

Bokeh 使用 Jinja2 模板,但它不提供对模板变量的任何访问。一种可能的解决方法是创建一个自定义模板类:

from hashlib import md5

from jinja2 import Template

from bokeh.io import save
from bokeh.models import Div


class ExtendedTemplate(Template):
    def render(self, *args, **kwargs):
        if 'with_hash' not in kwargs:
            kwargs['with_hash'] = with_hash
        return super().render(*args, **kwargs)


t = ExtendedTemplate("""\
<link href="{{ with_hash('app/static/css/custom.min.css') }}" rel="stylesheet">
""")


def with_hash(s):
    with open(s, 'rb') as f:
        return f'{s}?v={md5(f.read()).hexdigest()}'


save(Div(), template=t)

请注意,此特定代码假定 CSS 文件的路径可从其当前工作目录访问。

于 2020-05-13T08:06:25.773 回答