上传文件以更新Dropdown组件

时间:2019-02-11 04:35:26

标签: plotly-dash

我一直试图制作一个仪表板,在使用“上载”组件上载文件后,我可以在其中填充过滤器(诸如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)

以下是输出:

Console Output

服务器似乎没有响应(执行打印语句)。并且没有下拉列表。数据正确,我检查了。

感谢您的帮助。谢谢!

编辑:

如果我删除第二个回调以更新Dropdown组件,则服务器似乎响应。

Console Log 2

0 个答案:

没有答案