服务

要从单个Python脚本在Bokeh服务器上运行Bokeh应用程序,请将脚本名称传递给 bokeh serve 在命令行上:

bokeh serve app_script.py

默认情况下,Bokeh应用程序将由Bokeh服务器在本地主机的默认端口(5006)上提供服务,该端口位于路径下 /app_script ,即

http://localhost:5006/app_script

也可以在jupyter笔记本上运行相同的命令:

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 ,分别。

如果你能把参数传递给boh --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 选择权。

运行多个应用程序的另一种方法是使用glob表示法来指示与特定模式匹配的所有文件都应该得到服务。

bokeh serve *.py

命令行shell通常会展开 *.py 自动地。但是,如果您是以编程方式启动Bokeh服务器,那么带有globs的文件名参数可能不会被shell展开。在这种情况下 --glob 标志可用于使Bokeh服务器显式执行全局定位:

subprocess.call(["bokeh", "serve", "--glob", "*.py"])

应用程序配置

Bokeh服务器可以将底层的tornado服务器分成多个进程。这在尝试处理多个连接时非常有用,尤其是在需要高计算负载的应用程序上下文中。默认行为是一个进程。使用0将自动检测内核数并启动相应的进程数

bokeh serve app_script.py --num-procs 2

请注意,由于Tornado固有的限制,Windows不支持 --num-procs 值大于1!在这种情况下,考虑在负载平衡器后面运行多个Bokeh服务器实例。

Bokeh服务器还可以向所有URL路径添加可选前缀。这通常与“反向代理”设置结合使用。

bokeh serve app_script.py --prefix foobar

然后,申请将在以下URL下提供:

http://localhost:5006/foobar/app_script

如果需要,Bokeh服务器可以按固定的间隔发送keep-alive 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。通过使用指定来自其他主机的websocket连接,可以启用这些连接 BOKEH_ALLOW_WS_ORIGIN 环境变量或 --allow-websocket-origin 选项:

bokeh serve app_script.py --allow-websocket-origin foo.com:8081

可以通过添加 --allow-websocket-origin 选项多次,并提供以逗号分隔的主机列表 BOKEH_ALLOW_WS_ORIGIN

使Bokeh服务器覆盖所有请求的远程IP和URI方案/协议 X-Real-IpX-Forwarded-ForX-SchemeX-Forwarded-Proto 标头(如果提供了),则设置 --use-xheaders 选项:

bokeh serve app_script.py --use-xheaders

当在SSL终止的反向代理后面运行Bokeh服务器时,通常需要这样做。

警告

不建议在直接面向Internet的Bokeh服务器上设置此选项。

Bokeh服务器还可以通过指定指向PEM格式的单个文件的路径来直接终止SSL连接,该文件包含证书以及建立证书真实性所需的任意数量的CA证书:

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 模式下,服务器将接受URL中提供给它的任何会话ID。例如, http://localhost/app_script?bokeh-session-id=foo 将创建会话 foo . 在 unsigned 模式,如果会话ID未提供 ?bokeh-session-id= 在URL中,服务器仍然会生成一个加密的不可使用的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服务器的访问,则mode非常有用。如果某人被允许使用Bokeh应用程序,您将为他们生成一个会话ID,然后使用该有效会话ID将其重定向到Bokeh服务器。如果您不为某人生成会话ID,则他们无法从Bokeh服务器加载应用程序。

两者兼而有之 signedexternal-signed 模式下,密钥必须保密;任何拥有密钥的人都可以生成有效的会话ID。

密钥应该设置在 BOKEH_SECRET_KEY 环境变量,并且应该是一个加密随机字符串,至少有256位(32字节)的熵。这个 bokeh secret 命令可以生成新的密钥。

身份验证选项

Bokeh服务器只能配置为仅在有经过适当身份验证的用户时才允许连接。这是通过提供到模块的路径来实现命令行上的必要功能的:

bokeh serve --auth-module=/path/to/auth.py

或者通过设置 BOKEH_AUTH_MODULE 环境变量。

模块必须包含 one 将返回当前用户(或无)的以下两个函数之一:

def get_user(request_handler):
    pass

async def get_user_async(request_handler):
    pass

这个功能通过龙卷风传递 RequestHandler 并且可以检查cookie或请求头来确定经过身份验证的用户。如果没有有效的经过身份验证的用户,这些函数应该返回None。

此外,模块必须指定重定向未经验证的用户的位置。它必须包含:

  • 模块a属性 login_url 和(可选)a 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等而变化的情况下很有用。不能指定 LoginHandler 什么时候? get_url_function 定义。

与登录选项类似,可选 logout_urlLogoutHandler 值可以定义用于注销用户的端点。

如果没有提供身份验证模块,那么将假定一个默认用户,并且访问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 选项:

. 代码块::sh

bokeh服务应用程序_脚本.py--记录频率30000

该值以毫秒为单位指定。记录统计信息的默认间隔为0(禁用)。只接受正整数值。

class Serve(parser: argparse.ArgumentParser)[源代码]

子命令来启动Bokeh服务器。

customize_kwargs(args: argparse.Namespace, server_kwargs: Dict[str, Any]) → Dict[str, Any][源代码]

允许子类自定义 server_kwargs .

应该修改并返回 server_kwargs 字典。

invoke(args: argparse.Namespace)None[源代码]
name: str = 'serve'

此子命令的名称