Chcę wyświetlać wykresy oferowane przez bibliotekę bokeh w mojej aplikacji internetowej za pośrednictwem frameworku django, ale nie chcę używać pliku wykonywalnego bokeh-server, ponieważ nie jest to dobry sposób. więc to jest możliwe? jeśli tak, jak to zrobić?jak osadzić samodzielne wykresy bokeh w szablonach django
Odpowiedz
Na przykładzie Embedding Bokeh Plots dokumentacji sugerowane przez Fabio Pliger, można to zrobić w Django:
w pliku views.py
, kładziemy:
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})
w pliku urls.py
możemy umieścić:
from myapp.views import simple_chart
...
...
...
url(r'^simple_chart/$', simple_chart, name="simple_chart"),
...
...
w pliku szablonu simple_chart.html
będziemy mieli:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Experiment with Bokeh</title>
<script src="http://cdn.pydata.org/bokeh/release/bokeh-0.8.1.min.js"></script>
<link rel="stylesheet" href="http://cdn.pydata.org/bokeh/release/bokeh-0.8.1.min.css">
</head>
<body>
{{ the_div|safe }}
{{ the_script|safe }}
</body>
</html>
I działa.
Nie musisz używać bokeh-serwera do osadzania wykresów bokeh. Oznacza to, że nie będziesz używać (i prawdopodobnie nie potrzebujesz) dodatkowych funkcji, które zapewnia.
W rzeczywistości możesz osadzić wykresy bokeh na wiele sposobów, na przykład generując samodzielny html, generując niezależne komponenty bokeh, które możesz następnie osadzić w aplikacji django podczas renderowania szablonów lub za pomocą metody, którą nazywamy "autoloadingiem", co powoduje, że bokeh zwraca tag, który zastąpi się działką Bokeh. Więcej informacji znajdziesz na stronie documentation.
Innym dobrym źródłem inspiracji jest embed examples, którą można znaleźć w repozytorium.
Dziękuję bardzo Fabio –
Oto flask app który wykorzystuje jQuery interract z działki bokeh. Sprawdź kod templates/
dla javascript, którego możesz ponownie użyć. Szukaj również bokeh-demos na github.
Istnieje również możliwość pracy z żądaniami AJAX. Załóżmy, że mamy załadowaną stronę i chcemy pokazać wykres na kliknięciu przycisku bez ponownego ładowania całej strony. Z widoku Django wracamy skrypt bokeh i div w JSON:
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})
Kiedy otrzymujemy odpowiedzi AJAX w JS (w tym przykładzie jQuery jest używany) div najpierw dołączone do istniejącej strony, a następnie skrypt jest dołączana:
$("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);
}});
});
Dzięki za wprowadzenie sugestii w praktyce! Właściwie, dodając kilka "jak mogę umieścić mój spisek bokeh w {whatever_web_framework}?" sekcja do dokumentów lub gdzieś mogłaby być dobrym dodatkiem. Jeśli chcesz w tym pomóc, zaproponuj temat do dyskusji lub PR dodając ten przykład, możesz to zrobić. Byłbym bardzo doceniony! Dzięki! –
Jeśli zmienisz wersję na 0.11.1 w skryptach i css, działa również z Bokehem 0.11.1. –