Python Dash:从回调函数外部更新布局

Python Dash: Update Layout from Outside of Callback-Function

我的目标是 运行 本地网络中笔记本电脑上的 Dash 应用程序,并从位于同一网络中的微控制器触发 HTTP 请求。这些请求应由 Dash 应用程序捕获并应更新应用程序的布局。所以我的最终目标是为 Dash App 实现某种形式的远程控制。

当使用 Flask-server 并将其传递给 Dash-object 时,捕获 HTTP 请求没有问题:

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)

...

但由于主要的交互性来自 dash-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 请求的变化。

我已经尝试编写一个回调函数并从 @server.route 函数中调用它,但这没有用。

我怎样才能达到我想要的目标?

您可以使用 dcc.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() 的一种简单方法是使用将 HTTP 请求放入其中的队列 (queue.Queue)。现在,如何实施取决于您的需要。如果您需要能够同时为多个用户提供服务,则必须制定一个逻辑,以便每个用户都有自己的队列,这些队列应该被检查。