我一直试图制作一个仪表板,在使用“上载”组件上载文件后,我可以在其中填充过滤器(诸如Dropdown等短划线核心组件)和图形。
对于在回调之间共享数据,我使用一个隐藏的Div将CSV内容存储为json。
在使用隐藏的Div的'children'属性或Upload组件的content属性来更新回调中的下拉选项时,我遇到了问题。
这是我创建的最小的完整代码段:
import base64
import datetime
import io
import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Output, Input, State
import dash_table
app = dash.Dash(__name__)
app.title = 'Trial App'
app.layout = html.Div(
[
dcc.Upload(
id='file_upload',
children=[
'File Select'
]
),
html.Div(
id='uploaded_file',
style={
'display' : 'none'
}
),
dcc.Dropdown(
id='ride_drop'
)
]
)
def parse_contents(contents, filename, date):
content_type, content_string = contents.split(',')
decoded = base64.b64decode(content_string)
df = pd.read_csv(io.StringIO(decoded.decode('utf-8')))
return df
@app.callback(
Output('uploaded_file', 'children'),
[Input('file_upload', 'contents')],
[State('file_upload', 'filename'),
State('file_upload', 'last_modified')
]
)
def update_hidden_div(content, name, date):
#
if content is not None:
df = parse_contents(content, name, date)
jsonified_dataframe = df.to_json(
date_format='iso',
orient='split'
)
print('[INFO] Hidden Div updated')
return [
jsonified_dataframe
]
@app.callback(
Output('ride_drop', 'options'),
[Input('file_upload', 'contents')],
[State('uploaded_file', 'children')]
)
def update_ride_dropdown(content, jsonified_dataframe):
if content is not None:
df = pd.read_json(jsonified_dataframe, orient='split')
print('[INFO] Dataframe is of size: {}'.format(df.shape[0]))
rides = df['ride_num'].unique()
return [
{
'label': r,
'value' : r
} for r in rides
]
if __name__ == '__main__':
app.run_server(debug=True)
以下是输出:
服务器似乎没有响应(执行打印语句)。并且没有下拉列表。数据正确,我检查了。
感谢您的帮助。谢谢!
编辑:
如果我删除第二个回调以更新Dropdown组件,则服务器似乎响应。