使用 Dash 创建仪表板
Create a Dashboard using Dash
当我运行函数下面的代码program_exe.update_data()被执行了两次。避免这种情况的最佳方法是什么?该函数执行起来相对耗时,因此 运行 执行两次并不理想。如有任何建议,我们将不胜感激!
app = dash.Dash(__name__)
server = app.server
dict_main = program_exe.update_data() #this creates a nested dictionary
rpm = list(dict_main.keys())
channels = dict_main[rpm[0]]
app.layout = html.Div(
[
html.Div([
dcc.Dropdown(
id='rpm-dropdown',
options=[{'label': speed, 'value': speed} for speed in rpm],
value=list(dict_main.keys())[0],
# I removed the multi=True because it requires a distinction between the columns in the next dropdown...
searchable=False
),
], style={'width': '20%', 'display': 'inline-block'}),
html.Div([
dcc.Dropdown(
id='channel-dropdown',
multi=True
),
], style={'width': '20%', 'display': 'inline-block'}
),
html.Div([
dcc.Graph(
id='Main-Graph' # the initial graph is in the callback
),
], style={'width': '98%', 'display': 'inline-block'}
)
]
)
@app.callback(
Output('channel-dropdown', 'options'),
[Input('rpm-dropdown', 'value')])
def update_date_dropdown(speed):
return [{'label': i, 'value': i} for i in dict_main[speed]]
@app.callback(
Output('Main-Graph', 'figure'),
[Input('channel-dropdown', 'value')],
[State('rpm-dropdown', 'value')]) # This is the way to inform the callback which dataframe is to be charted
def updateGraph(channels, speed):
if channels:
# return the entire figure with the different traces
return go.Figure(data=[go.Scatter(x=dict_main[speed]['Manager'], y=dict_main[speed][i]) for i in channels])
else:
# at initialization the graph is returned empty
return go.Figure(data=[])
if __name__ == '__main__':
app.run_server(debug=True)
您可以使用缓存只命中一次函数。有关详细信息,请参阅 this page。
简短示例:
from flask_caching import Cache
cache = Cache(app.server, config={
'CACHE_TYPE': 'filesystem',
'CACHE_DIR': 'cache-directory',
})
@cache.memoize(timeout=6000)
def my_cached_function():
return program_exe.update_data()
我没有你的函数,但是,当我用占位符在本地测试它时,它最初被调用了两次,但在添加缓存后只调用了一次。
当我运行函数下面的代码program_exe.update_data()被执行了两次。避免这种情况的最佳方法是什么?该函数执行起来相对耗时,因此 运行 执行两次并不理想。如有任何建议,我们将不胜感激!
app = dash.Dash(__name__)
server = app.server
dict_main = program_exe.update_data() #this creates a nested dictionary
rpm = list(dict_main.keys())
channels = dict_main[rpm[0]]
app.layout = html.Div(
[
html.Div([
dcc.Dropdown(
id='rpm-dropdown',
options=[{'label': speed, 'value': speed} for speed in rpm],
value=list(dict_main.keys())[0],
# I removed the multi=True because it requires a distinction between the columns in the next dropdown...
searchable=False
),
], style={'width': '20%', 'display': 'inline-block'}),
html.Div([
dcc.Dropdown(
id='channel-dropdown',
multi=True
),
], style={'width': '20%', 'display': 'inline-block'}
),
html.Div([
dcc.Graph(
id='Main-Graph' # the initial graph is in the callback
),
], style={'width': '98%', 'display': 'inline-block'}
)
]
)
@app.callback(
Output('channel-dropdown', 'options'),
[Input('rpm-dropdown', 'value')])
def update_date_dropdown(speed):
return [{'label': i, 'value': i} for i in dict_main[speed]]
@app.callback(
Output('Main-Graph', 'figure'),
[Input('channel-dropdown', 'value')],
[State('rpm-dropdown', 'value')]) # This is the way to inform the callback which dataframe is to be charted
def updateGraph(channels, speed):
if channels:
# return the entire figure with the different traces
return go.Figure(data=[go.Scatter(x=dict_main[speed]['Manager'], y=dict_main[speed][i]) for i in channels])
else:
# at initialization the graph is returned empty
return go.Figure(data=[])
if __name__ == '__main__':
app.run_server(debug=True)
您可以使用缓存只命中一次函数。有关详细信息,请参阅 this page。
简短示例:
from flask_caching import Cache
cache = Cache(app.server, config={
'CACHE_TYPE': 'filesystem',
'CACHE_DIR': 'cache-directory',
})
@cache.memoize(timeout=6000)
def my_cached_function():
return program_exe.update_data()
我没有你的函数,但是,当我用占位符在本地测试它时,它最初被调用了两次,但在添加缓存后只调用了一次。