使用 autoload.js 为散景中的静态资源路径定义前缀
Define prefix for static resource paths in bokeh with autoload.js
我有一个像这样启动 Bokeh 服务器实例的服务:
server = Server({"/": app}, io_loop=loop, port=port,
allow_websocket_origin=['localhost:%d'%port, origin, self.request.host])
此服务在代理 (nbserverproxy) 后面运行,因此客户端只能通过 example.com/proxy/<port>/<path>
访问 localhost:<port>/<path>
我正在尝试 return 将加载我的散景应用程序的脚本标记,以确保从 example.com/proxy/<port>/<path>
请求资源
目前我是这样生成这个标签的:
script = """<script
src="{protocol}://{origin}{prefix}autoload.js?bokeh-autoload-element={ele_id}&bokeh-absolute-url={protocol}://{origin}&bokeh-app-path={prefix}"
id="{ele_id}"
data-bokeh-model-id=""
data-bokeh-doc-id=""
></script>""".format(protocol=protocol, origin=origin, prefix=prefix, ele_id=ele_id)
哪个(对于端口 45740 上的散景 运行 呈现如下内容:
<script
src="https://example.com/proxy/45740/autoload.js?bokeh-autoload-element=0535b6ca-6af2-4fcf-aa51-66d642fd3b08&bokeh-absolute-url=http://localhost:8888&bokeh-app-path=/proxy/45740/"
id="0535b6ca-6af2-4fcf-aa51-66d642fd3b08"
data-bokeh-model-id=""
data-bokeh-doc-id=""
></script>
这个标签会正确地 return 一些 Javascript 不幸的是在这个 JS 中它会尝试在如下位置加载 JS / CSS 资源:
https://example.com/static/js/bokeh.min.js
而不是
https://example.com/proxy/45740/static/js/bokeh.min.js
我想不出一种方法来告诉 bokeh 它在代理后面,这样从客户端的角度来看,所有路径都以“/proxy/45740/”开头。
我试过使用 prefix
arg 启动服务器,例如:
Server({"/": app}, prefix="/proxy/%s"%port, io_loop=loop, port=port, allow_websocket_origin=['localhost:%d'%port, origin, self.request.host])
这不起作用,因为代理在到达散景服务器之前去除了 /proxy/<port>
前缀,因此它不会传递给散景服务器并且散景服务器给出 404,因为它希望所有路径都有这个前缀.
有什么解决办法吗?
这是 prefix
的预期目的,nbserverproxy
的自动行为似乎很不幸。
一个可能的解决方案可能是让您的代理直接为 BokehJS 资源提供服务,而不是让 Bokeh 服务器来做。许多代理针对静态资源进行了优化,这也减少了 Bokeh 服务器上的负载,这可能与您的情况有关。
我对nbserverproxy
一无所知,但你可以看看https://demo.bokeh.org网站的旧版本是如何用nginx做到的:
https://github.com/bokeh/demo.bokeh.org
要点是这样的:将 BokehJS 文件复制到某个本地目录,并将代理配置为作为该目录提供服务 https://example.com/static/
我有一个像这样启动 Bokeh 服务器实例的服务:
server = Server({"/": app}, io_loop=loop, port=port,
allow_websocket_origin=['localhost:%d'%port, origin, self.request.host])
此服务在代理 (nbserverproxy) 后面运行,因此客户端只能通过 example.com/proxy/<port>/<path>
localhost:<port>/<path>
我正在尝试 return 将加载我的散景应用程序的脚本标记,以确保从 example.com/proxy/<port>/<path>
目前我是这样生成这个标签的:
script = """<script
src="{protocol}://{origin}{prefix}autoload.js?bokeh-autoload-element={ele_id}&bokeh-absolute-url={protocol}://{origin}&bokeh-app-path={prefix}"
id="{ele_id}"
data-bokeh-model-id=""
data-bokeh-doc-id=""
></script>""".format(protocol=protocol, origin=origin, prefix=prefix, ele_id=ele_id)
哪个(对于端口 45740 上的散景 运行 呈现如下内容:
<script
src="https://example.com/proxy/45740/autoload.js?bokeh-autoload-element=0535b6ca-6af2-4fcf-aa51-66d642fd3b08&bokeh-absolute-url=http://localhost:8888&bokeh-app-path=/proxy/45740/"
id="0535b6ca-6af2-4fcf-aa51-66d642fd3b08"
data-bokeh-model-id=""
data-bokeh-doc-id=""
></script>
这个标签会正确地 return 一些 Javascript 不幸的是在这个 JS 中它会尝试在如下位置加载 JS / CSS 资源:
https://example.com/static/js/bokeh.min.js
而不是
https://example.com/proxy/45740/static/js/bokeh.min.js
我想不出一种方法来告诉 bokeh 它在代理后面,这样从客户端的角度来看,所有路径都以“/proxy/45740/”开头。
我试过使用 prefix
arg 启动服务器,例如:
Server({"/": app}, prefix="/proxy/%s"%port, io_loop=loop, port=port, allow_websocket_origin=['localhost:%d'%port, origin, self.request.host])
这不起作用,因为代理在到达散景服务器之前去除了 /proxy/<port>
前缀,因此它不会传递给散景服务器并且散景服务器给出 404,因为它希望所有路径都有这个前缀.
有什么解决办法吗?
这是 prefix
的预期目的,nbserverproxy
的自动行为似乎很不幸。
一个可能的解决方案可能是让您的代理直接为 BokehJS 资源提供服务,而不是让 Bokeh 服务器来做。许多代理针对静态资源进行了优化,这也减少了 Bokeh 服务器上的负载,这可能与您的情况有关。
我对nbserverproxy
一无所知,但你可以看看https://demo.bokeh.org网站的旧版本是如何用nginx做到的:
https://github.com/bokeh/demo.bokeh.org
要点是这样的:将 BokehJS 文件复制到某个本地目录,并将代理配置为作为该目录提供服务 https://example.com/static/