散景服务器和 on.click (on.change) 无所事事
Bokeh server and on.click (on.change) doing nothing
我试图让 Bokeh 服务器打印出来,但我得到的只是 http://localhost:5006/?bokeh-session-id=default 上带有单选按钮的实例 运行。当我点击按钮时没有任何反应。有什么我想念的吗?
from bokeh.models.widgets import RadioButtonGroup
from bokeh.plotting import figure, show, output_server
def my_radio_handler():
print 'Radio button option selected.'
radio_button_group = RadioButtonGroup(
labels=["Option 1", "Option 2", "Option 3"], active=0)
radio_button_group.on_click(my_radio_handler)
output_server()
show(radio_button_group)
您需要同步服务器和当前会话才能取回信息。
from bokeh.client import push_session
from bokeh.models.widgets import RadioButtonGroup
from bokeh.plotting import curdoc, figure, show, output_server
def my_radio_handler(new):
print 'Radio button ' + str(new) + ' option selected.'
radio_button_group = RadioButtonGroup(
labels=['Option 1', 'Option 2', 'Option 3'], active=0)
radio_button_group.on_click(my_radio_handler)
# Open a session to keep our local document in sync with server
session = push_session(curdoc())
# Open the document in a browser
session.show(radio_button_group)
# Run forever (this is crucial to retrive callback's data)
session.loop_until_closed()
您可以使用 on_change()
对点击处理程序进行更多控制:
def my_radio_handler_complete(attr, old, new):
print(attr, old, new)
print('Radio button ' + str(new) + ' option selected.')
radio_button_group.on_change('active', my_radio_handler_complete)
仅供参考,在源代码中,on_click
只是 on_change()
的代理,定义为:
def on_click(self, handler):
self.on_change('active', lambda attr, old, new: handler(new))
上面的答案显示了如何使用 bokeh.client
和 push_session
以及 session.loop_until_closed
正确地完成此操作。
我想为上下文添加更多评论。 (我是Bokeh项目的核心开发者)
Bokeh 应用程序可以通过两种通用方式运行:
直接在服务器中
这些脚本 运行 类似于:
bokeh serve --show my_app.py
在这种情况下,代码、对象、所有回调等 运行ning 在 bokeh 服务器本身中。 情况如下所示:
browser <---> Bokeh Server
这是我总是首先推荐的方法。它需要最少的代码,最简单的部署,可以横向扩展,使用更少的网络流量,并且更健壮。
在单独的 Python 过程中
也可以使用 bokeh.client
在单独的进程中创建应用程序和 运行 回调。那么情况是这样的:
browser <---> Bokeh Server <---> another python process
然后 Bokeh 服务器真的只是成为中间人,在浏览器和您的 python 进程之间中继消息。这有缺点:
- 使网络流量加倍(对于新的 python 进程,根据定义是不可避免的)
- 需要更多代码来编写("Server Apps" 中不需要的所有
session
内容)
- 要求 python 进程无限期阻塞以服务回调(必须调用
session.loop_until_closed
)
过去,有一些特定的用例需要使用 bokeh.client
,例如:能够自定义每次使用的应用程序会话。但是现在 HTML 请求参数可用于 "Server Apps",无需 bokeh.client
即可完成。我想说现在采用 bokeh.client
方法的理由越来越少了。出于这个原因 我总是推荐 bokeh serve my_app.py
方法作为使用 Bokeh 服务器的第一个也是最好的方法.
但是,回到手头的问题:如果您忘记调用 session.loop_until_closed
,那么在 Separate Python Process 场景中会发生什么?那么 python 进程(有你的回调的那个!)完成,进程终止。然后就没有什么可以真正 运行 回调了。
嗯,这基本上就是 output_server
的情况。它执行会话设置的 "first half",将对象加载到服务器,但是随后调用 output_server
的 python 脚本完成,没有任何东西可以执行任何回调。由于历史原因,output_server
基本上仍然存在,但我想说它根本不是很有用。充其量,它可以将没有回调的应用程序加载到 Bokeh 服务器中,但是除了将 Web 应用程序连接到真正的 python 回调之外,为什么还需要 Bokeh 服务器?
目前(自发布 0.12.2
起)存在一个讨论弃用 output_server
的未决问题,原因如下:
https://github.com/bokeh/bokeh/issues/5154
TLDR; 目前出于任何原因我都不建议使用 output_server
。
我试图让 Bokeh 服务器打印出来,但我得到的只是 http://localhost:5006/?bokeh-session-id=default 上带有单选按钮的实例 运行。当我点击按钮时没有任何反应。有什么我想念的吗?
from bokeh.models.widgets import RadioButtonGroup
from bokeh.plotting import figure, show, output_server
def my_radio_handler():
print 'Radio button option selected.'
radio_button_group = RadioButtonGroup(
labels=["Option 1", "Option 2", "Option 3"], active=0)
radio_button_group.on_click(my_radio_handler)
output_server()
show(radio_button_group)
您需要同步服务器和当前会话才能取回信息。
from bokeh.client import push_session
from bokeh.models.widgets import RadioButtonGroup
from bokeh.plotting import curdoc, figure, show, output_server
def my_radio_handler(new):
print 'Radio button ' + str(new) + ' option selected.'
radio_button_group = RadioButtonGroup(
labels=['Option 1', 'Option 2', 'Option 3'], active=0)
radio_button_group.on_click(my_radio_handler)
# Open a session to keep our local document in sync with server
session = push_session(curdoc())
# Open the document in a browser
session.show(radio_button_group)
# Run forever (this is crucial to retrive callback's data)
session.loop_until_closed()
您可以使用 on_change()
对点击处理程序进行更多控制:
def my_radio_handler_complete(attr, old, new):
print(attr, old, new)
print('Radio button ' + str(new) + ' option selected.')
radio_button_group.on_change('active', my_radio_handler_complete)
仅供参考,在源代码中,on_click
只是 on_change()
的代理,定义为:
def on_click(self, handler):
self.on_change('active', lambda attr, old, new: handler(new))
上面的答案显示了如何使用 bokeh.client
和 push_session
以及 session.loop_until_closed
正确地完成此操作。
我想为上下文添加更多评论。 (我是Bokeh项目的核心开发者)
Bokeh 应用程序可以通过两种通用方式运行:
直接在服务器中
这些脚本 运行 类似于:
bokeh serve --show my_app.py
在这种情况下,代码、对象、所有回调等 运行ning 在 bokeh 服务器本身中。 情况如下所示:
browser <---> Bokeh Server
这是我总是首先推荐的方法。它需要最少的代码,最简单的部署,可以横向扩展,使用更少的网络流量,并且更健壮。
在单独的 Python 过程中
也可以使用 bokeh.client
在单独的进程中创建应用程序和 运行 回调。那么情况是这样的:
browser <---> Bokeh Server <---> another python process
然后 Bokeh 服务器真的只是成为中间人,在浏览器和您的 python 进程之间中继消息。这有缺点:
- 使网络流量加倍(对于新的 python 进程,根据定义是不可避免的)
- 需要更多代码来编写("Server Apps" 中不需要的所有
session
内容) - 要求 python 进程无限期阻塞以服务回调(必须调用
session.loop_until_closed
)
过去,有一些特定的用例需要使用 bokeh.client
,例如:能够自定义每次使用的应用程序会话。但是现在 HTML 请求参数可用于 "Server Apps",无需 bokeh.client
即可完成。我想说现在采用 bokeh.client
方法的理由越来越少了。出于这个原因 我总是推荐 bokeh serve my_app.py
方法作为使用 Bokeh 服务器的第一个也是最好的方法.
但是,回到手头的问题:如果您忘记调用 session.loop_until_closed
,那么在 Separate Python Process 场景中会发生什么?那么 python 进程(有你的回调的那个!)完成,进程终止。然后就没有什么可以真正 运行 回调了。
嗯,这基本上就是 output_server
的情况。它执行会话设置的 "first half",将对象加载到服务器,但是随后调用 output_server
的 python 脚本完成,没有任何东西可以执行任何回调。由于历史原因,output_server
基本上仍然存在,但我想说它根本不是很有用。充其量,它可以将没有回调的应用程序加载到 Bokeh 服务器中,但是除了将 Web 应用程序连接到真正的 python 回调之外,为什么还需要 Bokeh 服务器?
目前(自发布 0.12.2
起)存在一个讨论弃用 output_server
的未决问题,原因如下:
https://github.com/bokeh/bokeh/issues/5154
TLDR; 目前出于任何原因我都不建议使用 output_server
。