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:
- iframes (funciona bien), o
-
autoload_server
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.