У меня есть скрипт, который берет загруженные данные, объединяет их, превращает их в график (используя Bokeh) и затем экспортирует их в каталог как JSON.
В какой-то момент в будущем пользователь может нажать правильный URL-адрес, и соответствующий участок должен отображаться для пользователя как часть шаблона HTML.
Я могу создать сюжет. Я могу сохранить его как JSON. Я могу получить URL-адрес для его получения в формате JSON, но не могу отобразить график JSON в шаблоне.
Я копался в документации и примерах Bokeh, но все они, похоже, используют флягу для обслуживания страниц.
Я думаю, что я на правильном пути, используя views.py, чтобы найти и вернуть JSON как часть ответа render()
, а затем Bokeh.embed.embed_items()
выполнить работу в шаблоне, чтобы он выглядел правильно, но не получается - все, кроме сюжета отображается.
1) Создайте график и поместите его в каталог для последующего использования (app / results / 1)
создать plot.py
import os
import json
from django.conf import settings
from bokeh.embed import json_item
from bokeh.plotting import figure
x=[1,2,3,4,5]
y=[0,-1,-2,3,4]
p=figure(title="test_example")
p.line(x, y)
#json_export = json_item(p, "result")
json_export = json_item(p)
with open(os.path.join(settings.RESULTS_DIR,"1", "test.json"), 'w') as fp:
fp.write(json.dumps(json_export))
2) Настройка URL
urls.py
urlpatterns=[
path('result/<int:pk>', views.resultdetailview, name='result-detail'),
]
3) Возьмите запрос, используйте pk, чтобы найти график json и отобразите все это в соответствующем шаблоне.
views.py
def resultdetailview(request, pk):
results=str(pk)
with open(os.path.join(settings.RESULTS_DIR, results, "test.json"), 'r') as fp:
#data=json.load(fp)
data=json.loads(fp.read())
#context={'result':data}
#return render(request, 'app/sandbox_detail.html', context)
return render(request=request,
context={'json_object':data, 'resources':CDN.render()})
NB: Если я вместо этого использую return JsonResponse(data, safe=False)
, тогда URL-адрес успешно возвращает json ...
Поэтому я думаю, что проблема в шаблоне.
4) Покажите удивительный сюжет пользователю
sandbox_detail.html
<header>
<link rel="stylesheet" href="http://cdn.pydata.org./bokeh/release/bokeh-0.11.1.min.css" type="text/css" >
<script type="text/javascript" src="http://cdn.pydata.org./bokeh/release/bokeh-0.11.1.min.js"> </script>
</header>
<h1> Title: Test </h1>
<div>Test</div>
<body>
<div id="result"></div>
<script>
Bokeh.embed.embed_item({{json_object}}, "result");
</script>
</body>
Этот шаблон отображает все, кроме div "result".
Что я пропустил?