Bokeh 服务器 API#

将 Bokeh 服务器嵌入到更大的 Tornado 应用程序或 Jupyter notebook 中,并使用已有的 Tornado IOloop 可能很有用。 这是在这种场景中集成 Bokeh 的基础

from bokeh.server.server import Server

server = Server(
    bokeh_applications,  # list of Bokeh applications
    io_loop=loop,        # Tornado IOLoop
    **server_kwargs      # port, num_procs, etc.
)

# start timers and services and immediately return
server.start()

您也可以直接创建和控制 IOLoop。 当创建独立的“普通” Python 脚本来服务 Bokeh 应用程序,或将 Bokeh 应用程序嵌入到诸如 Flask 或 Django 之类的框架中而无需运行单独的 Bokeh 服务器进程时,这可能很有用。 您可以在示例目录中找到此技术的一些示例

另请注意,bokeh serve 的每个命令行参数都对应于 Server 的关键字参数。 例如,使用 --allow-websocket-origin 命令行参数等效于将 allow_websocket_origin 作为参数传递。

使用 bokeh.client 连接#

您可以通过客户端 API 直接与 Bokeh 服务器交互,您可以使用它来修改 Bokeh 服务器上现有会话中的 Bokeh 文档。

../../../_images/bokeh_serve_client.svg

通常,Web 浏览器连接到 Bokeh 服务器,但是您可以使用 bokeh.client 模块从 Python 建立连接。#

例如,这可能很有用,可以对由另一个 Web 框架(例如 Flask 或 Django)嵌入的 Bokeh 应用程序进行用户特定的自定义。 在以下示例中,Flask 端点嵌入了一个已经在服务器上运行的“sliders”应用程序,但在将输出传递给用户之前更改了绘图标题。

from flask import Flask, render_template

from bokeh.client import pull_session
from bokeh.embed import server_session

app = Flask(__name__)

@app.route('/', methods=['GET'])
def bkapp_page():

    with pull_session(url="https://127.0.0.1:5006/sliders") as session:

        # update or customize that session
        session.document.roots[0].children[1].title.text = "Special sliders for a specific user!"

        # generate a script to load the customized session
        script = server_session(session_id=session.id, url='https://127.0.0.1:5006/sliders')

        # use the script in the rendered page
        return render_template("embed.html", script=script, template="Flask")

if __name__ == '__main__':
    app.run(port=8080)