web-dev-qa-db-fra.com

Intégrer une application bokeh dans flask

J'essaie désespérément d'intégrer une applet bokeh fonctionnelle dans la fiole, et je ne trouve pas un moyen approprié de le faire. J'ai regardé tous les exemples, mais je n'en trouve pas qui inclut la possibilité de mettre à jour les données (meilleur exemple: le sliders_applet).

Si je ne me trompe pas, j'ai besoin du serveur bokeh pour pouvoir modifier les données (avec des curseurs, etc.). Le démarrage de l'applet de cette façon fonctionne, par exemple:

bokeh-server --script sliders_app.py

Mais je ne trouve pas la bonne méthode, ou du moins une méthode de travail pour intégrer le sliders_app dans la fiole. Et comme il devrait être possible d'utiliser plusieurs applets, il ne me semble pas propre de spécifier également une seule applet au démarrage du serveur bokeh.

J'apprécierais volontiers toute aide - le bokeh ressemble à un excellent outil pour moi.

20
lakerz

L'autre réponse ne décrit pas comment incorporer une application serveur Bokeh (elle utilise components pour incorporer un document Bokeh autonome).

Tout d'abord, vous pouvez voir de nombreux exemples en direct hébergés sur: https://demo.bokeh.org/

Pour intégrer des applications, il existe deux options habituelles:

Ce dernier est généralement utilisé comme ceci:

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

Cela renverra un <script> balise similaire à celle ci-dessous, que vous pouvez insérer dans votre réponse flask HTML, où que vous souhaitiez que l'application apparaisse:

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

Enfin, il est important de noter que par défaut le serveur Bokeh opte pour une configuration réseau assez conservatrice. Vous devrez démarrer le serveur Bokeh avec --allow-websocket-Origin L'option de ligne de commande est définie comme l'hôte dans lequel vous intégrez l'application bokeh.

10
bigreddot

EDIT par l'un des principaux développeurs du projet Bokeh Les informations ci-dessous ne répondent pas à la question ci-dessus. Il est catégoriquement impossible d'intégrer une application Bokeh en utilisant bokeh.embed.components comme décrit ci-dessous. components est uniquement capable d'incorporer des documents autonomes (c'est-à-dire qui ne fonctionnent PAS sur un serveur Bokeh)


Un exemple d'incorporation de bokeh avec un flacon est présent sur le dépôt github de bokeh .

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

Une autre idée serait d'exécuter bokeh-server et votre flask application web côte à côte, et chargez le code bokeh de cette façon (côté serveur ou via JS ou un iframe), mais cela pourrait être gênant.

10
halflings