我想通过Django框架在我的Web应用程序中显示Bokeh库提供的图表,但我不想使用bokeh-server可执行文件,因为这不是好的方式。那么这是可能的吗?如果是,如何做到呢?
我想通过Django框架在我的Web应用程序中显示Bokeh库提供的图表,但我不想使用bokeh-server可执行文件,因为这不是好的方式。那么这是可能的吗?如果是,如何做到呢?
按照Fabio Pliger的建议,使用Embedding Bokeh Plots文档示例,我们可以在Django中执行以下操作:
在views.py
文件中,我们放置:
from django.shortcuts import render
from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import components
def simple_chart(request):
plot = figure()
plot.circle([1,2], [3,4])
script, div = components(plot, CDN)
return render(request, "simple_chart.html", {"the_script": script, "the_div": div})
在urls.py
文件中,我们可以放置以下代码:
from myapp.views import simple_chart
...
...
...
url(r'^simple_chart/$', simple_chart, name="simple_chart"),
...
...
在模板文件simple_chart.html
中,我们将有:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Experiment with Bokeh</title>
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-0.8.1.min.js"></script>
<link rel="stylesheet" href="http://cdn.bokeh.org/bokeh/release/bokeh-0.8.1.min.css">
</head>
<body>
{{ the_div|safe }}
{{ the_script|safe }}
</body>
</html>
它有效。
还可以通过AJAX请求来实现它的工作。假设我们已经加载了一个页面,想要在不重新加载整个页面的情况下在按钮单击时显示绘图。从Django视图中,我们以JSON格式返回Bokeh脚本和div:
from django.http import JsonResponse
from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import components
def simple_chart(request):
plot = figure()
plot.circle([1,2], [3,4])
script, div = components(plot, CDN)
return JsonResponse({"script": script, "div": div})
当我们在 JS 中获取 AJAX 响应时(本例使用 Jquery),div 首先被附加到现有页面,然后将脚本附加:
$("button").click(function(){
$.ajax({
url: "/simple_chart",
success: function(result){
var bokeh_data = JSON.parse(result);
$('#bokeh_graph').html(bokeh_data.div);
$("head").append(bokeh_data.script);
}});
});
必须将{{the_script | safe}}放在head标签内部
templates/
以获取可重用的javascript代码。还可以在github上搜索bokeh-demos。