Встраивание приложения с эффектом боке в Flask

Я отчаянно пытаюсь встроить работающий апплет боке во фляжку и не могу найти подходящий способ сделать это. Я просмотрел все примеры, но не нашел ни одного, который включает возможность обновления данных (лучший пример: sliders_applet).

Если я не ошибаюсь, мне нужен боке-сервер, чтобы иметь возможность изменять данные (с помощью ползунков и т. Д.). Запуск апплета таким образом работает, например:

bokeh-server --script sliders_app.py

Но я не могу найти правильный или, по крайней мере, рабочий способ встраивания sliders_app во фляжку. И поскольку должно быть возможно использовать несколько апплетов, мне не кажется чистым указывать один-единственный апплет при запуске сервера боке ...

Я с радостью буду благодарен за любую помощь - боке мне кажется отличным инструментом.


person lakerz    schedule 29.04.2015    source источник


Ответы (2)


Другой ответ не описывает, как встраивать серверное приложение Bokeh (оно использует components для встраивания автономного документа Bokeh).

Во-первых, вы можете увидеть множество живых примеров, размещенных по адресу: https://demo.bokeh.org/

Для встраивания приложений есть два обычных варианта:

Последний обычно используется так:

from bokeh.embed import server_document
script = server_document("https://demo.bokeh.org/sliders")

Это вернет тег <script>, аналогичный приведенному ниже, который вы можете вставить в свой HTML-ответ фляги, где бы вы ни хотели, чтобы приложение появилось:

<script
    src="https://demo.bokeh.org/sliders/autoload.js?bokeh-autoload-element=1000&bokeh-app-path=/sliders&bokeh-absolute-url=https://demo.bokeh.org/sliders"
    id="1000">
</script>

Наконец, важно отметить, что по умолчанию сервер Bokeh выбирает довольно консервативную конфигурацию сети. Вам нужно будет запустить сервер Bokeh с параметром командной строки --allow-websocket-origin, установленным в качестве любого хоста, на который вы встраиваете приложение bokeh.

person bigreddot    schedule 29.10.2016
comment
У вас есть два полностью рабочих примера для иллюстрации iframe и autoload_server? - person mr.bjerre; 14.01.2017
comment
Я не уверен, о чем вы спрашиваете. IFrames буквально <iframe src="https://url.to.bokeh/server"></iframe> - person bigreddot; 09.08.2017
comment
Да, новый сайт находится на demo.bokeh.org (ответ обновлен) - person bigreddot; 03.04.2019

РЕДАКТИРОВАТЬ одним из основных разработчиков проекта Bokeh. Приведенная ниже информация не отвечает на поставленный выше вопрос. Категорически невозможно встроить приложение с эффектом боке, используя bokeh.embed.components, как описано ниже. components может встраивать только автономные документы (т. Е. НЕ запускаемые на сервере 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://docs.bokeh.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://docs.bokeh.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()

Другой вариант - запустить bokeh-server и ваше flask веб-приложение бок о бок и таким образом загрузить код боке (на стороне сервера, через JS или iframe), но это может вызвать проблемы.

person halflings    schedule 29.04.2015
comment
Большое спасибо! Проблема для меня с этим примером заключается в том, что он просто создает новый график с новыми параметрами - а не тот тип интерактивности, который я ищу, и, во-вторых, он не включает настоящий апплет боке - давайте использовать sliders_app.py Пример: это настоящее приложение с эффектом боке, которое отлично работает напрямую на сервере боке, а также обладает той реальной интерактивностью, которую я ищу. Я не могу найти способ просто встроить этот апплет. - person lakerz; 30.04.2015
comment
Ммм. Глядя на код сервера боке, я вижу, что они делают довольно много вещей. Приложение Flask создается в конце app.py но только позже (в start.py) изменен. Может быть, вы могли бы повторно использовать этот код в start.py и добавить свои маршруты в экземпляр app? - person halflings; 01.05.2015
comment
Это выглядит интересно, я разберусь с этим, думаю, мне потребуется некоторое время, чтобы полностью понять. Пока что я нашел два других варианта: (1) Не используйте элементы управления боке, вместо этого повторно реализуйте элементы управления (например, с помощью jQuery). Работает нормально, но кажется немного ненужным, если само боке обеспечивает такую ​​же функциональность. (2) Просто вставьте URL-адрес апплета боке в iFrame. Похоже, он работает нормально, но почему-то у меня есть дикая догадка, что использование iFrames на самом деле не очень хороший стиль ... но прошло уже много лет с тех пор, как я что-то сделал для Интернета, может быть, это изменилось в настоящее время? - person lakerz; 01.05.2015
comment
iframe по-прежнему имеют смысл в некоторых случаях использования, и этого может быть достаточно, особенно если вы используете его только для внутренних целей или для небольшого веб-приложения. - person halflings; 03.05.2015
comment
Да, я тоже так думал, но я столкнулся с еще одной проблемой с элементами управления боке, например, ползунки не работают с сенсорными интерфейсами; поэтому я решил использовать боке только для сюжетов и реализовать элементы управления в другом месте. - person lakerz; 03.05.2015
comment
@lakerz: Есть относительно новая библиотека под названием Spyre, которая предоставляет что-то похожее на bokeh-server, хотя ее не обязательно проще встраивать. Вы можете посмотреть здесь: github.com/adamhajari/spyre - person halflings; 06.05.2015
comment
Спасибо, выглядит интересно, я разберусь. - person lakerz; 07.05.2015
comment
Привет, ребята, а кому-нибудь удалось реализовать аккуратную интеграцию сервера боке с флягой? Если да, размещение кода в качестве ответа было бы очень полезным. - person multigoodverse; 30.10.2015
comment
Кажется, я не могу заставить ваш пример работать в боке 0.11: bokeh.templates стало bokeh.core.templates, и есть RESOURCES, но JD_RESOURCES и CSS_RESOURCES - person famargar; 02.02.2017
comment
@famargar: Это старый ответ, так что он вполне может быть правдой. Не могли бы вы найти аналог в новой версии и соответствующим образом обновить ответ? - person halflings; 03.02.2017
comment
@famargar: теперь вы просто загружаете INLINE: из bokeh.resources import INLINE и получаете ресурсы JS следующим образом: js_resources = INLINE.render_js (). Это изменение отражено в моем редактировании, которое в настоящее время проходит экспертную оценку. Спасибо, что указали мне полезный пример, халфлинги! - person Brian Bartoldson; 14.07.2017
comment
@CDspace не думал, что ваш ответ следует обновлять, даже если вы просите кого-нибудь обновить ваш ответ двумя комментариями выше, поэтому мое редактирование не удалось рецензировать, и кому-то еще придется попробовать, халфлинги. - person Brian Bartoldson; 15.07.2017