无法在Django模板中嵌入JSON Bokeh Plot

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

我有一个脚本,它接收上传的数据,将它们组合在一起,将其变成一个图(使用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)设置网址

URLs.朋友

urlpatterns=[
    path('result/<int:pk>', views.resultdetailview, name='result-detail'),
]

3)接受请求,使用pk查找json图并在适当的模板中将其全部呈现。

views.朋友

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()})

注意:如果我改为使用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之外的所有内容。

我错过了什么?

python json django bokeh
2个回答
1
投票

这是我到目前为止所看到的:

首先:您正在混合使用两种方法将绘图json数据注入页面。根据文档,您可以使用以下两种方法之一来完成:

1)直接指定div

Python: json_data = json.dumps(json_item(p, "myplot"))
JavaScript: Bokeh.embed.embed_item(item);

2)在div函数中指定embed_item

Python: json_data = json.dumps(json_item(p))
JavaScript: Bokeh.embed.embed_item(item, "myplot");

但不是两个人在同一时间。这可能是问题吗?

第二:最好不要手动插入Bokeh资源:而是使用CDN.render()或INLINE.render()自动包含脚本所需的全部内容:

import json
from bokeh.resources import CDN

return render(request  = request, 
              template_name = 'app/sandbox_detail.html', 
              context = { json_object = json.loads(json_string), 
                          resources = CDN.render() } )

sandbox_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
{{ resources }}
</head>
<body>
<div id="result"></div>
<script>
    Bokeh.embed.embed_item({{ json_object }}, "result");
</script>
</body>
</html>

第三:确保你在页面中嵌入的是json对象而不是字符串(参见上面的变量命名)


0
投票

在浏览器的调试工具中调试渲染模板时,它会有所帮助。

我尝试了一种非常类似的方法,发现了一个很大的缺陷:我的浏览器注意到它无法找到None对象。这里的原因是python将空值存储为None,而JavaScript期望null对象。

解决方案?当你运行qazxsw poi时,Python已经将qazxsw poi翻译成qazxsw poi。为了保持这种方式,请将json字符串作为字符串读取。因此,而不是你的None使用null

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