I want to add a password functionality to a bokeh dashboard (a modified and extended code based on the example shown here, I also posted this problem here). The logic behind is that I create a dashboard with a “passblock” item where a password can be entered and a second block which is empty. If the password is correct the “passblock” item is removed and the empty placeholder bloxk is filled with the interactive dashboard block. In this example the interactive dashboard is the slider and if you change it the value is printed via the callback function. While the callback works fine if I directly include a range slider in the dashboard section (see commented section) it is not working any more if the password and user have been entered correctly. Even if I add the range_slider before and only replace it with the new one within the verify_pwd section it is not working. So what do I need to change? Any ideas appreciated.
from bokeh.models.widgets import PasswordInput,Button, TextInput,PreText,RangeSlider from bokeh.layouts import column, row PASSWD = "1" #password USER = "1" #username max_count_tries = 5 #max allowed tries before dashboard is killed count_tries = 0 # counter for max tries def verify_pwd(): """ verifies if user and pwd are entered correctly. If so the password block is set to zero and the dashboard block which was zero before is replaced by the slider""" global count_tries global range_slider if (pwd.value==PASSWD) & (user.value == USER): #pwe and user entered correctly print('logged in') range_slider = RangeSlider(start=0., end=10., value=(2.,3.), step=.1, title="secret slider") layout.children = row() layout.children = row([range_slider]) else: #pwd or user are wrong if (pwd.value!=PASSWD) & (user.value == USER): mytext.text = ''.join(['wrong password!\n',str(max_count_tries-count_tries), ' tries left']) elif (pwd.value==PASSWD) & (user.value != USER): mytext.text = ''.join(['wrong user!\n',str(max_count_tries-count_tries), ' tries left']) else: mytext.text = ''.join(['wrong user and wrong password!\n',str(max_count_tries-count_tries), ' tries left']) count_tries += 1 if count_tries>max_count_tries: layout.children = row() def callback(attrname, old, new): # Get the current slider values and print the value in the console global range_slider lower = range_slider.value upper = range_slider.value print(lower,upper) mytext = PreText() #placeholder for error message user = TextInput(title="UserName:") # unser name entry field pwd = PasswordInput(title="Password:") #password entry field btn = Button(label="login") # button to log in btn.on_click(verify_pwd) # if button was clicked compare pwd and user with entries #pwd.callback(verify_pwd) passblock = row([user, pwd, btn, mytext]) # create a block to the dashboard where the pwd and user can be entered range_slider = RangeSlider(start=0., end=10., value=(0.,0.), step=.1, title="dummy") # create a dummy slider which is not used range_slider.on_change('value', callback) # callback for slider if values change layout = column(passblock,row()) # create a layout with the password block and an empty block which is filled as soon as the pwd and user are ok #layout = column(passblock,range_slider) # create bokeh document and deploy it from bokeh.io import curdoc curdoc().add_root(layout)