如何将散列字符串添加到 Bokeh 应用程序中的自定义资源 URL?

How to add hash strings to custom resources urls in a Bokeh Application?

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

到目前为止我已经添加了this example中的资源

{% 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">

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

我找到了 this class,但它似乎只是为了散景资源

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

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 文件的路径可从其当前工作目录访问。