come incorporare grafici bokeh standalone in modelli Django

Voglio visualizzare i grafici offerti dalla libreria bokeh nella mia applicazione web tramite il framework django, ma non voglio usare l’eseguibile bokeh-server perché non è il modo giusto. quindi è ansible? se sì come farlo?

Usando l’esempio di documentazione di Embedding Bokeh Plots come suggerito da Fabio Pliger, si può farlo in Django:

nel file views.py , inseriamo:

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

nel file urls.py possiamo inserire:

 from myapp.views import simple_chart ... ... ... url(r'^simple_chart/$', simple_chart, name="simple_chart"), ... ... 

nel file template simple_chart.html avremo:

     Experiment with Bokeh     {{ the_div|safe }} {{ the_script|safe }}   

E funziona.

Non è necessario utilizzare bokeh-server per incorporare grafici bokeh. Significa solo che non userete (e probabilmente non ne avrete bisogno) le funzionalità extra che fornisce.

In effetti puoi incorporare i grafici bokeh in molti modi, come generare html standalone, generando i componenti standalone di bokeh che puoi quindi incorporare nell’app django durante il rendering dei modelli o con il metodo che chiamiamo “autoloading” che fa sì che bokeh restituisca un tag che sostituirà stesso con una trama Bokeh. Troverai i dettagli migliori guardando la documentazione .

Un’altra buona fonte di ispirazione sono gli esempi di embed che puoi trovare nel repository.

Deve mettere {{the_script | safe}} all’interno del tag head

È anche ansible farlo funzionare con richieste AJAX. Diciamo che abbiamo una pagina caricata e vorremmo mostrare un grafico sul clic del pulsante senza ricaricare l’intera pagina. Dalla vista Django, restituiamo lo script Bokeh e div in 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}) 

Quando riceviamo la risposta AJAX in JS (in questo esempio viene usato Jquery) il div viene prima aggiunto alla pagina esistente e quindi lo script viene aggiunto:

 $("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); }}); }); 

Ecco un’app che utilizza jquery per interagire con una trama bokeh. Dai un’occhiata ai templates/ per javascript che puoi riutilizzare. Cerca anche i demo del bokeh su github.