gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:03:44 28 4
gpt4 key购买 nike

我有一个脚本,它获取上传的数据,将其组合在一起,将其转换为绘图(使用 Bokeh),然后将其作为 JSON 导出到目录。

在将来的某个时刻,用户可以点击正确的 URL,并且相应的绘图应该作为 HTML 模板的一部分显示给用户。

我可以生成情节。我可以将其另存为 JSON。我可以获取 URL 以将其检索为 JSON,但无法获取要在模板内呈现的 JSON 图。

我深入研究了 Bokeh 文档和示例,但它们似乎都使用 Flask 应用程序来提供页面服务。

我认为我走在正确的轨道上,使用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.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()})

注意:如果我改为使用return JsonResponse(data, safe=False),则 url 会成功返回 json ...

因此我认为问题出在模板中。

4)向用户展示奇妙的情节

sandbox_detail.html

<header>
<link rel="stylesheet" href="http://cdn.bokeh.org./bokeh/release/bokeh-0.11.1.min.css" type="text/css" >
<script type="text/javascript" src="http://cdn.bokeh.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 之外的所有内容。

我错过了什么?

最佳答案

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

第一:您正在混合两种方法将绘图 json 数据注入(inject)到页面中。根据文档,您可以使用以下两种方法之一来完成此操作:

1) 直接指定div:

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

2) 在embed_item函数中指定div:

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 对象而不是字符串(请参阅上面的变量命名)

关于python - 无法在 Django 模板中嵌入 JSON Bokeh Plot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55628401/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com