我正在用模板编程一个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资源的。
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文件的路径可以从当前工作目录中访问。