Может быть, вам поможет этот упрощенный пример jinja2 (протестировано на Bokeh v1.0.4).Запустите его как:
python myapp.py
Структура файлов и каталогов:
myapp
|
+---myapp.py
+---templates
+---index.html
myapp.py
import io
import json
import jinja2
import numpy as np
from bokeh.plotting import figure, curdoc
from bokeh.embed import json_item
from bokeh.resources import CDN
plot = figure()
plot.line(np.arange(10), np.random.random(10))
curdoc().add_root(plot)
renderer = jinja2.Environment(loader = jinja2.FileSystemLoader(['templates']), trim_blocks = True)
html = renderer.get_template('index.html').render(resources = CDN.render(), item_json_object = json.dumps(json_item(plot)))
filename = 'json_items.html'
with io.open(filename, mode = 'w', encoding = 'utf-8') as f:
f.write(html)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
{{ resources }}
</head>
<body>
<div id="myplot"></div>
<script>
Bokeh.embed.embed_item({{ item_json_object }}, "myplot");
</script>
</body>
</html>
Кажется, что результат json.dumps(json_item(plot)
), переданный в шаблон, уже является объектом JSON, поэтому вы не можете использовать JSON.parse()
для него.Или убедитесь, что вы действительно передали строковый объект этой функции.
Документация Bokeh вы ссылаетесь на пример , который отличается от этого в том смысле, что данные графиков загружаются динамически с помощью метода JS fetch () ввремя загрузки страницы в браузере, в то время как здесь данные графиков прикрепляются к странице во время рендеринга шаблона.