如何在Bokeh应用程序中向自定义资源URLs添加哈希字符串?

问题描述 投票:0回答:1

我正在用模板编程一个Bokeh服务器应用程序。我已经添加了一些自定义CSS和JS文件。但是当我做一些更改时,文件会从缓存中重新加载,我无法看到新的更改。一个解决方案是在URL的末尾添加一个变量,以便从头开始加载它们,只是如果有一些变化。Bokeh资源就是这样工作的。

我已经添加了资源,如下图所示 本例 到目前为止

{% 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资源的。

python html hash bokeh no-cache
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文件的路径可以从当前工作目录中访问。

© www.soinside.com 2019 - 2024. All rights reserved.