Визуализация компонентов DA SH через websocket - PullRequest
0 голосов
/ 25 февраля 2020

Можно ли визуализировать сериализованные компоненты Da sh на внешнем интерфейсе?

Здесь небольшое само-контейнерное приложение, которое связывает нажатие кнопки с обратным вызовом. Обратный вызов внутренне выдает пять сообщений через сокет, и эти сообщения принимаются от внешнего интерфейса, а содержимое сообщения записывается на консоль.

Вместо простой записи содержимого сообщения на консоль Я хотел бы каким-то образом использовать DashRenderer, чтобы преобразовать сериализованные dash_html_components в правильные значения HTML (и вставить их в дерево HTML DOM).

import dash_html_components as html
from dash import Dash
from flask import Flask
from dash.dependencies import Input
from dash.dependencies import Output
from dash.exceptions import PreventUpdate
from flask_socketio import SocketIO

# add socketio script to javascript
external_scripts = [
    {
        'src': 'https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js',
        'integrity': 'sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=',
        'crossorigin': 'anonymous'
    }
]

server = Flask(__name__)
socketio = SocketIO(server)

app = Dash(__name__, server=server, external_scripts=external_scripts, serve_locally=True)

app.index_string = '''
<!DOCTYPE html>
<html>
    <head>
        {%metas%}
        <title>{%title%}</title>
        {%favicon%}
        {%css%}
    </head>
    <body>
        {%app_entry%}
        <footer>
            {%config%}
            {%scripts%}
            <script>
                var socket = io();
                socket.on("component-channel", function (component, cb) {
                   console.log("Component: ")
                   console.log(component)
                });
            </script>
            {%renderer%}
        </footer>
    </body>
</html>
'''

app.layout = html.Div(
    id="outer-div", children=[
        html.Button("Send event", id="button"),
        html.Div(id="output-div")
    ]
)


@app.callback(
    Output("output-div", "children"),
    [Input("button", "n_clicks")]
)
def on_click(n_clicks):
    if n_clicks is None:
        raise PreventUpdate()

    import time
    for i in range(5):
        component = html.P("Loop {}".format(i))
        serialised_component = component.to_plotly_json()
        socketio.emit("component-channel", serialised_component)
        time.sleep(2)

    return html.P("Terminated")


if __name__ == '__main__':

    app.run_server()

Как мне рендеринг данных, полученных в веб-сокете, в правильное значение HTML?

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

enter image description here

...