Hi!
this is somewhat of a mixture of a feature request and a bug report. here is my example:
importdashimportdash_core_componentsasdccimportdash_html_componentsashtmlfromdash.dependenciesimportInput, Output, Stateimportjsonimportosexternal_stylesheets= ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app=dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.config.suppress_callback_exceptions=Truetry:
os.remove('cities.json')
exceptOSError:
passdefmake_cb(city):
@app.callback(Output('%s-pushed'%city, 'children'), [Input('%s-but'%city, 'n_clicks')], [State('%s-but'%city, 'children')])deffing(nc,cval):
ifnc:
returncvalreturn''defget_layout():
try:
cities=json.load(open('cities.json'))
exceptFileNotFoundError:
cities= []
returnhtml.Div([
dcc.Input(id='input-1', type='text', value='Montréal'),
html.Button(id='submit-button', n_clicks=0, children='Submit'),
html.Div(id='pushed-city'),
html.Div([html.Div([html.Button(c,id='%s-but'%c),
html.Div(id='%s-pushed'%c)])
forcincities],id='output-state')
])
app.layout=get_layout@app.callback(Output('output-state', 'children'), [Input('submit-button', 'n_clicks')], [State('input-1', 'value')])defupdate_output(n_clicks, input1):
try:
cities=set(json.load(open('cities.json')))
exceptFileNotFoundError:
cities=set()
ifinput1notincitiesandinput1isnotNone:
cities.add(input1)
cities=list(cities)
json.dump(cities,open('cities.json','w'))
make_cb(input1)
print(app.callback_map)
return [html.Div([html.Button(c,id='%s-but'%c),
html.Div(id='%s-pushed'%c)])
forcincities]
if__name__=='__main__':
app.run_server(debug=True)this is a simple app based on the documentation, that allows the user to add interactive elements, with some caching. There are two issues. The first one I don't understand, the second one I do.
If I click the submit button, to add a city, everything appears fine, the print(app.callback_map) line shows me that the callback has been registered, i can see everything in the browser, however the callback does not become active, until I refresh the browser.
If I use a proper server like gunicorn not the flask development server, with parallel processes, the callback_map dictionary is not shared, so the whole thing breaks down, and the callbacks basically don't work.
Now, I'm quite sure that 1, has some easy explanation that I'm just a little too tired to figure out, I wrote this whole thing because of 2,
I also hacked together a solution for myself for the second one, that allows for declaring the callback map as a shared key-value store, using redis. If anyone's interested, I can post a PR. As far as i can see, only __iter__, __getitem__, __setitem__ and items() are utilized from the callback_map.
I looked through #577#475#373this and this. Based on these, creating a shared key-value store for the callbacks is a well isolated issue that fits the main arch of these topics.
Hi!
this is somewhat of a mixture of a feature request and a bug report. here is my example:
this is a simple app based on the documentation, that allows the user to add interactive elements, with some caching. There are two issues. The first one I don't understand, the second one I do.
If I click the submit button, to add a city, everything appears fine, the
print(app.callback_map)line shows me that the callback has been registered, i can see everything in the browser, however the callback does not become active, until I refresh the browser.If I use a proper server like gunicorn not the flask development server, with parallel processes, the callback_map dictionary is not shared, so the whole thing breaks down, and the callbacks basically don't work.
Now, I'm quite sure that 1, has some easy explanation that I'm just a little too tired to figure out, I wrote this whole thing because of 2,
I also hacked together a solution for myself for the second one, that allows for declaring the callback map as a shared key-value store, using redis. If anyone's interested, I can post a PR. As far as i can see, only
__iter__,__getitem__,__setitem__anditems()are utilized from the callback_map.I looked through #577#475#373this and this. Based on these, creating a shared key-value store for the callbacks is a well isolated issue that fits the main arch of these topics.