web-dev-qa-db-ja.com

flaskにボケアプリを埋め込む

作業用のボケ味のアプレットをフラスコに埋め込もうと必死になっており、これを行う適切な方法が見つかりません。すべての例を調べましたが、データを更新する機能を含む例は見つかりません(最良の例:sliders_applet)。

私が間違っていない場合は、データを変更できるようにするためにボケサーバーが必要です(スライダーなどを使用)。この方法でアプレットを起動すると、次のように機能します。

bokeh-server --script sliders_app.py

しかし、私は適切な、または少なくともSlides_appをフラスコに埋め込むための実用的な方法を見つけることができません。また、複数のアプレットを使用できるはずなので、ボケサーバーの起動時に1つのアプレットを指定するのは私には不自然に思えます。

手助けをいただければ幸いです-ボケは私にとって素晴らしいツールのように見えます。

20
lakerz

もう1つの回答では、Bokehサーバーアプリを埋め込む方法については説明していません(スタンドアロンのBokehドキュメントを埋め込むためにcomponentsを使用しています)。

まず、次の場所でホストされている多くのライブ例を見ることができます: https://demo.bokeh.org/

アプリを埋め込むには、2つの通常のオプションがあります。

後者は通常、次のように使用されます。

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

これにより、以下のような<script>タグが返されます。これは、アプリを表示したい場所にflask HTML応答を挿入できます。

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

最後に、Bokehサーバーはデフォルトでかなり保守的なネットワーク構成を選択することに注意することが重要です。 --allow-websocket-Originコマンドラインオプションを設定してBokehサーバーを起動し、Bokehアプリを埋め込むホストを指定する必要があります。

10
bigreddot

Bokehプロジェクトのコア開発者の1人による編集以下の情報は、上記の質問には答えません。以下に説明するようにbokeh.embed.componentsを使用してBokehApplicationを埋め込むことは絶対的に不可能です。 componentsは、スタンドアロンのドキュメントのみを埋め込むことができます(つまり、Bokehサーバーでは実行できません)。


ボケをフラスコに埋め込む例bokeh github repo にあります。

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

もう1つのアイデアは、bokeh-serverflask Webアプリを並べて実行し、その方法で(サーバー側またはJSまたはiframeを介して)ボケコードをロードすることですが、面倒です。

10
halflings