Kim O
Kim O

Reputation: 621

Plot and Dash: Object of type 'Response' is not JSON serializable

I want to build a Dashboard where most of the content (headers, graphs, etc.) are dependent on a main input from the user.

Therefore, I want to create many callbacks so that output is dependent on the user input.

But this seems to cause many errors. The current one is: "Object of type 'Response' is not JSON serializable" But more generally, I am also looking for some inputs on my code.

################## APP LAYOUT ##################
app.layout = html.Div(

    #style={'backgroundColor': colors['background']},
    children=[

        html.H1('Dashboard for Visualisation',
            style={
            'textAlign': 'center',
            'color': colors['text_black']
            }),

       # html.H3('Choose Analysis',
       #         style={
        #            'textAlign': 'center',
         #           'color': colors['text_black']
          #      }),

        html.Div([
            dcc.Dropdown(
                id='main_dropdown',
                options=[
                    {'label':'PCA', 'value':'PCA'},
                    {'label':'t-SNE', 'value':'t-SNE'}
                    ]

                )],

            style={'width': '28%',
                   'display': 'inline-block',
                   'textAlign': 'center'}
            ),


        html.Div(id='action_header'),

        html.Div(id='action'),

        html.Div(id='sub_action'),

        html.Div(id='output_graph'),

        dcc.Slider(
            id='slider',
            min=0,
            max=55,
            step=None,
            value=20,
            marks={
                5:'5',
                10:'10',
                15:'15',
                20:'20',
                25:'25',
                30:'30',
                35:'35',
                40:'40',
                45:'45',
                50:'50'
            },
            updatemode='drag'
            )

        #html.Div(id='slider_div')


    ])


################## CALLBACKS ##################
@app.callback(
    Output(component_id='action_header', component_property='children'),
    [Input(component_id='main_dropdown', component_property='value')])

def update_action_header(input):
    if(input == 't-SNE'):
        return html.H3("Pick labels to identify clusters",
            id='action_header')




@app.callback(
    Output(component_id='action', component_property='children'),
    [Input(component_id='main_dropdown', component_property='value')])

def update_action_options(input):
    if(input == 't-SNE'):
        return dcc.Dropdown(id='gene-Dropdown',
                 options=[{'label': s, 'value': s}
                          for s in temp.keys()],
                 value=['IDH1','SomeGene1','SomeGene2'],
                 multi=True
                 )



@app.callback(
    Output(component_id='sub_action', component_property='children'),
    [Input(component_id='main_dropdown', component_property='value')])

def update_sub_action_options(input):
    if (input == 't-SNE'):
        return [
            html.Label('Dimensions in plot'),
            dcc.RadioItems(
                options=[
                    {'label': '2D', 'value': '2'},
                    {'label': '3D', 'value': '3'},
                ],
                value='2'
            )
        ]



@app.callback(
    Output(component_id='output_graph', component_property='children'),
    [Input(component_id='slider', component_property='value')])

def update_graph(input):                           # Pull det correct dataframe

    # Return graph
    return dcc.Graph(
        id='tsne_perplexity_plot',
        figure={
            'data': [
                go.Scatter(
                    {'x':   dict['perp' + str(input)]['x'],
                    'y':    dict['perp' + str(input)]['y'],
                    'mode': 'markers',
                    'opacity': 0.7,
                               'marker' : {
                                          'size': 15,
                                          'line': {'width': 0.5, 'color': 'white'}
                                      }
                    }
                )
            ],
            'layout': {
                    'title': "Perplexity: " + str(input),
                   # 'plot_bgcolor': colors['background'],
                    #'paper_bgcolor': colors['background'],
                    'font': {
                    'color': colors['text']
                    },
            }
        }
    )

Thank you so much! I am really stuck.

Note: the error happens then first time I try to use the dropdown menu Full traceback:

enter image description here

 * Running on http://127.0.0.1:8050/ (Press CTRL+C to quit)
127.0.0.1 - - [26/Jun/2018 14:55:55] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Jun/2018 14:55:56] "GET /_dash-layout HTTP/1.1" 200 -
127.0.0.1 - - [26/Jun/2018 14:55:56] "GET /_dash-dependencies HTTP/1.1" 200 -
[2018-06-26 14:55:56,845] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 14:55:56] "POST /_dash-update-component HTTP/1.1" 500 -
[2018-06-26 14:55:56,859] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 14:55:56] "POST /_dash-update-component HTTP/1.1" 500 -
[2018-06-26 14:55:56,863] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 14:55:56] "POST /_dash-update-component HTTP/1.1" 500 -
127.0.0.1 - - [26/Jun/2018 14:55:56] "POST /_dash-update-component HTTP/1.1" 200 -
127.0.0.1 - - [26/Jun/2018 14:55:57] "GET /favicon.ico HTTP/1.1" 200 -
[2018-06-26 14:55:58,329] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 14:55:58] "POST /_dash-update-component HTTP/1.1" 500 -
[2018-06-26 14:55:58,334] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 14:55:58] "POST /_dash-update-component HTTP/1.1" 500 -
[2018-06-26 14:55:58,351] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 14:55:58] "POST /_dash-update-component HTTP/1.1" 500 -
Object of type 'Response' is not JSON serializable[2018-06-26 15:52:04,380] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 15:52:04] "POST /_dash-update-component HTTP/1.1" 500 -
[2018-06-26 15:52:04,392] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 15:52:04] "POST /_dash-update-component HTTP/1.1" 500 -
[2018-06-26 15:52:04,402] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 558, in dispatch
    return self.callback_map[target_id]['callback'](*args)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 515, in add_context
    output_value = func(*args, **kwargs)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/dash/dash.py", line 526, in add_context
    cls=plotly.utils.PlotlyJSONEncoder),
  File "/Users/kimrants/anaconda3/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/kimrants/anaconda3/lib/python3.6/site-packages/plotly/utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "/Users/kimrants/anaconda3/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Response' is not JSON serializable
127.0.0.1 - - [26/Jun/2018 15:52:04] "POST /_dash-update-component HTTP/1.1" 500 -

Upvotes: 4

Views: 8720

Answers (1)

PatientOtter
PatientOtter

Reputation: 2298

You don't show what your data looks like, you code snippet doesn't have all of your variables you call and there are some syntax errors. Let's get started.

Flask is the being using in the background but you do not need to worry about using Requests from flask or any other similar module. You're just passing html elements and not something serializable like a list. In all of your callbacks, if you are sending objects to the children attribute of a div it needs to be in a list. e.g. html.H3('text here') ==> [html.H3('text here')].

As I commented earlier:

{'x': dict['perp' + str(input)]['x'], doesn't make sense. dict is a type function so it needs parenthesis ( ) not brackets [ ]. Also, 'perp' + str(input)is not a key/value pair so dict( ) will still throw an error

If you saved a variable with the name dict DO NOT DO THAT. It's a function and you don't want to overwrite the name of built-in functions.

You give two elements the same ID. This will cause errors. You have html.Div(id='action_header') and html.H3("Pick labels to identify clusters", id='action_header'). This will create a loop that will destroy your application.

From what you provided above I was able to put this code together that works. It should be close to what you need.

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

# I added these to make your code work. change to your variables. 
app = dash.Dash()
server = app.server
temp = {'IDH1':1,'SomeGene1':2,'SomeGene2':3, "option3":4, "another":5}
colors = {'text':"#666", 'text_black':'#000000'}

################## APP LAYOUT ##################
app.layout = html.Div(

    children=[

        html.H1('Dashboard for Visualisation',
            style={
            'textAlign': 'center',
            'color': colors['text_black']
            }),

        html.Div([
            dcc.Dropdown(
                id='main_dropdown',
                options=[
                    {'label':'PCA', 'value':'PCA'},
                    {'label':'t-SNE', 'value':'t-SNE'}
                    ]

                )],

            style={'width': '28%',
                   'display': 'inline-block',
                   'textAlign': 'center'}
            ),


        html.Div(id='action_header'),

        html.Div(id='action'),

        html.Div(id='sub_action'),

        html.Div(id='output_graph'),

        dcc.Slider(
            id='slider',
            min=0,
            max=55,
            step=None,
            value=20,
            marks={
                5:'5',
                10:'10',
                15:'15',
                20:'20',
                25:'25',
                30:'30',
                35:'35',
                40:'40',
                45:'45',
                50:'50'
            },
            updatemode='drag'
            )



    ])


################## CALLBACKS ##################
@app.callback(
    Output(component_id='action_header', component_property='children'),
    [Input(component_id='main_dropdown', component_property='value')])

def update_action_header(input):
    if(input == 't-SNE'):
        return [html.H3("Pick labels to identify clusters")]

@app.callback(
    Output(component_id='action', component_property='children'),
    [Input(component_id='main_dropdown', component_property='value')])

def update_action_options(input):
    if(input == 't-SNE'):
        return [dcc.Dropdown(id='gene-Dropdown',
                 options=[{'label': s, 'value': s}
                          for s in temp.keys()],  # what is temp? not defined so I made something up.
                 value=['IDH1','SomeGene1','SomeGene2'],
                 multi=True
                 )]



@app.callback(
    Output(component_id='sub_action', component_property='children'),
    [Input(component_id='main_dropdown', component_property='value')])

def update_sub_action_options(input):
    if (input == 't-SNE'):
        return [
            html.Label('Dimensions in plot'),
            dcc.RadioItems(
                options=[
                    {'label': '2D', 'value': '2'},
                    {'label': '3D', 'value': '3'},
                ],
                value='2'
            )
        ]



@app.callback(
    Output(component_id='output_graph', component_property='children'),
    [Input(component_id='slider', component_property='value')])

def update_graph(input):                           # Pull det correct dataframe

    # Return graph
    return [dcc.Graph(
        id='tsne_perplexity_plot',
        figure={
            'data': [
                go.Scatter(
                    {'x':   [1, 2, 3],  # put random in because I didn't
                    'y':    [4, 8, 1],  # know what your data looks like
                    'mode': 'markers',
                    'opacity': 0.7,
                               'marker' : {
                                          'size': 15,
                                          'line': {'width': 0.5, 'color': 'white'}
                                      }
                    }
                )
            ],
            'layout': {
                    'title': "Perplexity: "+str(input),
                    'font': {
                        'color': colors['text']
                    },
            }
        }
    )]



if __name__ == '__main__':
    """ 
    If this file is ran by command line it will start the flask server
    """
    app.run_server(debug = False, port = 8050)  # Set debug = True when developing

If you are going to use dash I would suggest using trace = {'type':'scatter', ...} instead of import graph objects. It doesn't really matter but Dash does a nice job of wrapping everything together so you don't have to use dict() and { } and use their other sub-modules. It's also common in Python to not use parentheses on you if statements.

# bad
if (x == 5):
    # do foo

# good
if x == 5:
    # do foo

read here for style guidelines. PEP8 is also very popular. Style guides will help your code become more readable and keep you from making silly mistakes.

Finally, input is actually a function in python and you should not use it as a variable in you callbacks. See documentation for input(). You should not overwrite or use built-in functions or variables for names of your variables or functions. It will confuse the reader and could cause errors in your code.

Upvotes: 4

Related Questions