Как мы можем встроить объекты макета боке (содержащие несколько графиков и виджетов) в приложение фляги? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть объект bokeh layout / curr_doc, и я хочу встроить его в приложение фляги. Я могу встраивать все графики и виджеты по компонентам, но как единый макет я нигде не нахожу ссылок. Причина, по которой я хочу встроить полный макет, заключается в том, что это сохранит интерактивность между графиками и виджетами.

1 Ответ

0 голосов
/ 16 ноября 2018

Проверьте следующий пример, он находится в папке примеров в проекте GH. Вы можете проверить больше примеров, связанных с внедрением здесь . Вы также можете создать iframe и включить в него все свое приложение (хотя обычно оно тяжелее для браузера). Проверьте здесь также ответ Брайана , но учтите, что в последних версиях боке вы должны использовать server_document вместо autoload_server, как показано в этом примере:

import atexit
import subprocess

from flask import render_template_string, Flask
from bokeh.embed import server_document

home_html = """
<!DOCTYPE html>
<html lang="en">
  <body>
    <div class="bk-root">
      <h1><a href="/batch/1"> Batch 1 (cos)</a></h1>
      <h1><a href="/batch/2"> Batch 2 (sin)</a></h1>
      <h1><a href="/batch/3"> Batch 3 (tan)</a></h1>
    </div>
  </body>
</html>
"""

app_html = """
<!DOCTYPE html>
<html lang="en">
  <body>
    <div>
        <h2><a href="/batch/1">Batch 1 (cos)</a> - <a href="/batch/2">Batch 2 (sin)</a> - <a href="/batch/3">Batch 3 (tan)</a></h2>
    </div>
    {{ bokeh_script|safe }}
  </body>
</html>
"""

app = Flask(__name__)

bokeh_process = subprocess.Popen(
    ['python', '-m', 'bokeh', 'serve', '--allow-websocket-origin=localhost:5000', 'bokeh_server.py'], stdout=subprocess.PIPE)

@atexit.register
def kill_server():
    bokeh_process.kill()

@app.route('/')
def home():
    return render_template_string(home_html)

@app.route('/batch/<int:batchid>')
def visualization(batchid):
    bokeh_script = server_document(url='http://localhost:5006/bokeh_server', arguments=dict(batchid=batchid))
    return render_template_string(app_html, bokeh_script=bokeh_script)

if __name__ == '__main__':
    app.run(debug=True)
...