服务#
要在Bokeh服务器上从单个Python脚本运行Bokeh应用程序,请在命令行中将脚本名称传递给bokeh serve
:
bokeh serve app_script.py
默认情况下,Bokeh应用程序将由Bokeh服务器在默认端口(5006)上的localhost提供服务,路径为/app_script
,即,
http://localhost:5006/app_script
也可以在jupyter notebooks中运行相同的命令:
bokeh serve app_notebook.ipynb
这将生成与使用Python脚本描述的相同结果
并且应用程序将在默认端口(5006)上提供服务
在本地主机上,路径为/app_notebook
应用程序也可以从目录创建。该目录应包含一个main.py
(以及任何其他所需的辅助模块)以及任何额外的资源(例如,主题文件)。将目录名称传递给bokeh serve
以运行应用程序:
bokeh serve app_dir
可以同时运行多个应用程序:
bokeh serve app_script.py app_dir
如果您希望自动打开浏览器以显示HTML页面,您可以在命令行中传递--show
选项:
bokeh serve app_script.py app_dir --show
这将打开两个页面,分别用于 /app_script
和 /app_dir
。
如果您想将命令行参数传递给Bokeh应用程序,您可以将--args
选项作为命令行的最后一个选项传递:
bokeh serve app_script.py myapp.py --args foo bar --baz
在应用程序运行时,--args
之后的所有内容都将包含在 sys.argv
中。在这种情况下,当 myapp.py
执行时,sys.argv
的内容将是 ['myapp.py', 'foo', 'bar', '--baz']
,这与 Python 对 sys.argv
的标准期望一致。
请注意,如果提供了多个脚本或目录,它们都会接收到由--args
给出的相同命令行参数(如果有的话)。
如果您只有一个应用程序,服务器根目录将重定向到它。 否则,您可以在服务器根目录看到所有正在运行的应用程序的索引:
http://localhost:5006/
可以使用--disable-index
选项禁用此索引,并且可以使用--disable-index-redirect
选项禁用重定向行为。
另一种运行多个应用程序的方法是使用通配符表示法来指示应提供与特定模式匹配的所有文件。
bokeh serve *.py
命令行shell通常会自动扩展*.py
。然而,如果你以编程方式启动Bokeh服务器,那么带有通配符的文件名参数可能不会被shell扩展。在这种情况下,可以使用--glob
标志来让Bokeh服务器显式执行通配符扩展:
subprocess.call(["bokeh", "serve", "--glob", "*.py"])
可以使用 --ico-path
选项配置 .ico 文件,Bokeh 服务器将返回此文件的内容以响应 /favicon.ico
请求:
bokeh serve app.py --ico-path=/assets/app.ico
由于浏览器只查看顶级根目录,即使运行多个应用程序,也只能提供一个.ico文件。默认情况下,Bokeh项目徽标作为favicon.ico文件返回。
应用程序配置#
Bokeh 服务器可以将底层的 tornado 服务器分叉为多进程。这在尝试处理多个连接时非常有用,特别是在需要高计算负载的应用程序环境中。默认行为是一个进程。使用 0 将自动检测核心数量并启动相应数量的进程。
bokeh serve app_script.py --num-procs 2
请注意,由于Tornado固有的限制,Windows不支持--num-procs
值大于一!在这种情况下,考虑在负载均衡器后面运行多个Bokeh服务器实例。
Bokeh服务器还可以在所有URL路径中添加一个可选的前缀。 这在与“反向代理”设置结合使用时通常非常有用。
bokeh serve app_script.py --prefix foobar
然后应用程序将在以下URL下提供服务:
http://localhost:5006/foobar/app_script
如果需要,Bokeh 服务器可以以固定间隔发送保持活动的 ping。
要配置此功能,请设置 --keep-alive
选项:
bokeh serve app_script.py --keep-alive 10000
该值以毫秒为单位指定。默认的保持活动间隔为37秒。给出0的值以禁用保持活动的ping。
网络配置#
要控制Bokeh服务器监听的端口,请使用--port
参数:
bokeh serve app_script.py --port 8080
要在任意端口上监听,请传递0
作为端口号。实际的端口号将在启动时记录。
同样,可以使用--address
参数指定特定的网络地址。例如:
bokeh serve app_script.py --address 0.0.0.0
Bokeh 服务器将监听所有可用的网络地址。
默认情况下,不允许跨站点连接到Bokeh服务器的websocket。您可以通过使用BOKEH_ALLOW_WS_ORIGIN
环境变量或--allow-websocket-origin
选项指定允许的额外主机来启用来自这些主机的websocket连接。
bokeh serve app_script.py --allow-websocket-origin foo.com:8081
可以通过多次添加--allow-websocket-origin
选项来指定多个允许的websocket来源,并向BOKEH_ALLOW_WS_ORIGIN
提供一个以逗号分隔的主机列表
为了让Bokeh服务器覆盖所有请求的远程IP和URI方案/协议,使用X-Real-Ip
、X-Forwarded-For
、X-Scheme
、X-Forwarded-Proto
头信息(如果提供了这些头信息),请设置--use-xheaders
选项:
bokeh serve app_script.py --use-xheaders
这通常在运行一个SSL终止的反向代理后面的Bokeh服务器时需要。
警告
不建议在直接面向互联网的Bokeh服务器上设置此选项。
Bokeh 服务器也可以通过指定一个包含证书以及任何数量的 CA 证书的 PEM 格式文件的路径来直接终止 SSL 连接,以建立证书的真实性:
bokeh serve --ssl-certfile /path/to/cert.pem
或者,也可以通过设置环境变量 BOKEH_SSL_CERTFILE
来提供路径。
如果私钥是单独存储的,可以通过设置--ssl-keyfile
命令行参数或设置BOKEH_SSL_KEYFILE
环境变量来提供其位置。如果私钥需要密码,则应通过设置BOKEH_SSL_PASSWORD
环境变量来提供。
会话ID选项#
通常,每个连接到Bokeh服务器的浏览器标签都会有自己唯一的会话ID。当服务器生成ID时,会使其在加密上不可猜测。这样可以防止用户访问彼此的会话。
为了控制谁可以使用Bokeh应用程序,服务器可以使用密钥对会话ID进行签名,并拒绝“伪造”的会话名称。有三种模式,由--session-ids
参数控制:
bokeh serve app_script.py --session-ids signed
可用的模式有:unsigned, signed 或 external-signed
在unsigned
模式下,服务器将接受URL中提供的任何会话ID。例如,http://localhost/app_script?bokeh-session-id=foo
将创建一个会话foo
。在unsigned
模式下,如果URL中没有提供?bokeh-session-id=
,服务器仍将生成一个加密不可猜测的ID。然而,服务器允许客户端创建可猜测或故意共享的会话,如果他们愿意的话。
unsigned
模式在服务器本地运行时最为有用,例如,您可以让多个进程访问固定的会话名称,如 default
。unsigned
模式也很方便,因为不需要生成或配置密钥。
在signed
模式下,会话ID必须采用特殊格式并使用密钥签名。尝试使用无效会话ID的应用程序将失败,但如果未提供?bokeh-session-id=
参数,服务器将生成一个新的、签名的会话ID。signed
模式的结果是只允许安全的会话ID,但任何人都可以连接到服务器。
在external-signed
模式下,会话ID必须被签名,但服务器本身不会生成会话ID;?bokeh-session-id=
参数将是必需的。要使用此模式,外部进程(如另一个Web应用程序)将使用函数bokeh.util.token.generate_session_id()
来创建有效的会话ID。外部进程和Bokeh服务器必须共享相同的BOKEH_SECRET_KEY
环境变量。
external-signed
模式在你希望另一个进程来验证对Bokeh服务器的访问时非常有用。如果有人被允许使用Bokeh应用程序,你可以为他们生成一个会话ID,然后使用该有效的会话ID将他们重定向到Bokeh服务器。如果你没有为某人生成会话ID,那么他们将无法从Bokeh服务器加载应用程序。
在signed
和external-signed
模式下,密钥必须保密;任何拥有该密钥的人都可以生成有效的会话ID。
密钥应设置在BOKEH_SECRET_KEY
环境变量中,并且应为一个加密随机字符串,至少具有256位(32字节)的熵。bokeh secret
命令可以生成新的密钥。
认证选项#
Bokeh服务器可以配置为仅在存在经过适当身份验证的用户时允许连接。这是通过在命令行上提供实现必要功能的模块路径来实现的:
bokeh serve --auth-module=/path/to/auth.py
或通过设置BOKEH_AUTH_MODULE
环境变量。
模块必须包含以下两个函数中的一个,该函数将返回当前用户(或None):
def get_user(request_handler):
pass
async def get_user_async(request_handler):
pass
该函数接收Tornado RequestHandler
,并可以检查cookies或请求头以确定认证用户。如果没有有效的认证用户,这些函数应返回None。
此外,模块必须指定未认证用户的重定向位置。 它必须包含以下之一:
一个模块属性
login_url
和(可选的)一个LoginHandler
类一个用于
get_login_url
的函数定义
login_url = "..."
class LoginHandler(RequestHandler):
pass
def get_login_url(request_handler):
pass
当提供一个相对的login_url
时,也可以提供一个可选的LoginHandler
类,它将自动作为路由安装在Bokeh服务器上。
get_login_url
函数在登录 URL 必须根据请求或 cookie 等变化的情况下非常有用。当定义了 get_url_function
时,无法指定 LoginHandler
。
类似于登录选项,可选的logout_url
和LogoutHandler
值可以定义一个用于用户注销的端点。
如果没有提供认证模块,则将假定一个默认用户,并且访问Bokeh服务器端点时不需要认证。
警告
auth模块的内容将被执行!
Bokeh 还可以启用 Tornado 的 XFRF cookie 保护功能。要启用此功能,请使用 --enable-xsrf-cookies
选项,或设置环境变量 BOKEH_XSRF_COOKIES=yes
。如果启用了此设置,任何对自定义或登录处理程序的 PUT、POST 或 DELETE 操作都必须正确配置才能正常工作。通常,这意味着将 xsrf_form_html()
模块添加到 HTML 表单提交模板中。有关详细信息,请参阅:
会话过期选项#
要配置检查未使用会话的频率,请设置
--check-unused-sessions
选项:
bokeh serve app_script.py --check-unused-sessions 10000
该值以毫秒为单位指定。检查未使用会话的默认间隔为17秒。仅接受正整数。
要配置未使用会话的持续时间,请设置
--unused-session-lifetime
选项:
bokeh serve app_script.py --unused-session-lifetime 60000
该值以毫秒为单位指定。未使用会话的默认生命周期间隔为15秒。仅接受正整数。
诊断选项#
日志级别可以通过 --log-level
参数控制:
bokeh serve app_script.py --log-level debug
可用的日志级别有:trace, debug, info, warning, error 或 critical
日志格式可以通过--log-format
参数控制:
bokeh serve app_script.py --log-format "%(levelname)s: %(message)s"
默认的日志格式是 "%(asctime)s %(message)s"
要控制统计日志的写入频率,请设置
--stats-log-frequency
选项:
bokeh serve app_script.py --stats-log-frequency 30000
该值以毫秒为单位指定。记录统计信息的默认间隔为15秒。仅接受正整数。
Bokeh 还可以选择性地记录进程内存使用情况。此功能需要安装可选的 psutil
包。要启用内存记录,请设置 --mem-log-frequency
选项:
bokeh serve app_script.py --mem-log-frequency 30000
该值以毫秒为单位指定。记录统计信息的默认间隔为0(禁用)。仅接受正整数。
- class Serve(parser: ArgumentParser)[源代码]#
启动Bokeh服务器的子命令。
- customize_applications(args: Namespace, applications: dict[str, Any]) dict[str, Any] [source]#
允许子类自定义
applications
。应修改并返回
applications
字典的副本。