python flask applet bokeh

python - Incrustar una aplicación de bokeh en un matraz



flask applet (2)

La otra respuesta no describe cómo incrustar una aplicación de servidor Bokeh (usa components para incrustar un documento de Bokeh independiente).

Primero, puedes ver muchos ejemplos en vivo alojados en: https://demo.bokehplots.com/

Para insertar aplicaciones hay dos opciones habituales:

Este último generalmente se usa así:

script = autoload_server(model=None, app_path="/apps/slider", url="https://demo.bokehplots.com")

Esto devolverá una etiqueta <script> similar a la siguiente, que puede poner en la respuesta HTML de su matraz, donde quiera que aparezca la aplicación:

<script src="https://demo.bokehplots.com/apps/slider/autoload.js?bokeh-autoload-element=c5c9bdb5-40e8-46a2-9bf0-40a9d396ce97" id="c5c9bdb5-40e8-46a2-9bf0-40a9d396ce97" data-bokeh-model-id="" data-bokeh-doc-id="" ></script>

Por último, es importante tener en cuenta que, de forma predeterminada, el servidor Bokeh opta por una configuración de red bastante conservadora. Tendrá que iniciar el servidor de Bokeh con la opción de línea de comandos de --allow-websocket-origin establecida en cualquier servidor en el que esté incorporando la aplicación de bokeh.

Intento desesperadamente insertar un applet de bokeh en el matraz y no puedo encontrar una forma adecuada de hacerlo. Revisé todos los ejemplos, pero no puedo encontrar ninguno que incluya la capacidad de actualizar los datos (mejor ejemplo: sliders_applet).

Si no me equivoco, necesito el servidor de bokeh para poder cambiar los datos (con controles deslizantes, etc.). Iniciar el applet de esta manera funciona, por ejemplo:

bokeh-server --script sliders_app.py

Pero no puedo encontrar la manera adecuada, o al menos una forma práctica de insertar el sliders_app en el matraz. Y dado que debería ser posible usar múltiples applets, no me parece limpio especificar un único applet al inicio del servidor de bokeh.

Con mucho gusto agradecería cualquier ayuda, bokeh parece una gran herramienta para mí.


EDITAR por uno de los desarrolladores principales del proyecto Bokeh La información a continuación no responde a la pregunta anterior. Es categóricamente imposible insertar una aplicación Bokeh mediante el uso de bokeh.embed.components como se describe a continuación. components solo es capaz de incrustar documentos independientes (es decir, que NO se ejecutan en un servidor Bokeh)

Un ejemplo de incrustación bokeh con matraz está presente en el repositorio bokeh github .

import flask from bokeh.embed import components from bokeh.plotting import figure from bokeh.resources import INLINE from bokeh.templates import RESOURCES from bokeh.util.string import encode_utf8 app = flask.Flask(__name__) colors = { ''Black'': ''#000000'', ''Red'': ''#FF0000'', ''Green'': ''#00FF00'', ''Blue'': ''#0000FF'', } def getitem(obj, item, default): if item not in obj: return default else: return obj[item] @app.route("/") def polynomial(): """ Very simple embedding of a polynomial chart""" # Grab the inputs arguments from the URL # This is automated by the button args = flask.request.args # Get all the form arguments in the url with defaults color = colors[getitem(args, ''color'', ''Black'')] _from = int(getitem(args, ''_from'', 0)) to = int(getitem(args, ''to'', 10)) # Create a polynomial line graph x = list(range(_from, to + 1)) fig = figure(title="Polynomial") fig.line(x, [i ** 2 for i in x], color=color, line_width=2) # Configure resources to include BokehJS inline in the document. # For more details see: # http://bokeh.pydata.org/en/latest/docs/reference/resources_embedding.html#module-bokeh.resources plot_resources = RESOURCES.render( js_raw=INLINE.js_raw, css_raw=INLINE.css_raw, js_files=INLINE.js_files, css_files=INLINE.css_files, ) # For more details see: # http://bokeh.pydata.org/en/latest/docs/user_guide/embedding.html#components script, div = components(fig, INLINE) html = flask.render_template( ''embed.html'', plot_script=script, plot_div=div, plot_resources=plot_resources, color=color, _from=_from, to=to ) return encode_utf8(html) def main(): app.debug = True app.run() if __name__ == "__main__": main()

Otra idea sería ejecutar bokeh-server y la aplicación web del flask uno al lado del otro, y cargar el código bokeh de esa manera (en el servidor o mediante JS o un iframe), pero eso podría ser problemático.