Python Da sh: Обновить макет вне функции обратного вызова - PullRequest
1 голос
/ 09 июля 2020

Моя цель - запустить приложение Da sh на ноутбуке в локальной сети и инициировать HTTP-запросы от микроконтроллера, который находится в той же сети. Эти запросы будут перехватываться приложением Da sh и должны обновлять макет приложения. Итак, моя цель в конечном итоге - реализовать некоторую форму удаленного управления для приложения Da sh.

Перехват HTTP-запросов не является проблемой при использовании Flask -сервера и передаче его на Dash -object:

import flask
import dash

server = flask.Flask(__name__)
app = dash.Dash(__name__, server=server)

...

@server.route('/start_switch', methods=['GET'])
def start_switch():
    print('server.route ran!')
    
    # What do i run here to update layout-elements?

    return Response('', 200)

...

но поскольку основная интерактивность исходит от da sh -callbacks, я не знаю, как я могу обновить макет, как в:

@app.callback(Output('show-status', 'children'),
              [Input('app2-status', 'children')])
def watch_kalibrierung(app2_status):
    """
    As soon as app2-status changes the function echoes
    its contents to the in div 'show-status'
    """
    return app2_status

потому что теперь я слушаю не изменения в UI-элементе, а HTTP-запрос.

Я уже пробовал написать callback-функцию и вызвать ее из @server.route -функции, но это не сработало.

Как я могу достичь желаемой цели?

1 Ответ

2 голосов
/ 09 июля 2020

Вы можете использовать компонент d cc .Interval , чтобы пользовательский интерфейс опрашивал изменения, например, каждую секунду. Затем

Что-то вроде

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output


# Insert this component into your layout
# Every 1000 milliseconds, the n_interval is increased, which 
# can be tied to a callback
interval = dcc.Interval(
    id='interval-component',
    interval=1000, # in milliseconds
    n_intervals=0
)

# Tie a callback to the interval
@app.callback(Output('some-output-component', 'children'),
              [Input('interval-component', 'n_intervals')])
def update_metrics(n):
    some_stuff = check_http_requests() # your custom function
    component = html.Div(some_stuff) # create new children for some-output-component
    return component

Один простой способ передать данные из HTTP-запросов в check_http_requests() - использовать очереди ( queue.Queue ) в который вы помещаете HTTP-запросы. Теперь, как это должно быть реализовано, зависит от ваших потребностей. Если вам нужно иметь возможность обслуживать нескольких пользователей одновременно, вы должны создать logi c, чтобы у каждого пользователя были свои очереди, которые нужно проверять.

...