为Bokeh的autoload.js设置静态资源路径前缀(代理场景)
嘿,我来帮你搞定这个资源路径不匹配的问题!这种情况是因为Bokeh默认会基于当前域名的根路径来加载静态资源和建立WebSocket连接,但你的服务部署在example.com/proxy/<port>/<path>这样的代理路径后,必须显式告诉Bokeh要使用这个代理路径作为资源根目录。
下面是具体的解决步骤:
1. 生成script标签时指定root_url参数
不管你是手动写script标签还是用Bokeh的Python工具生成,都需要添加root_url属性,让Bokeh知道所有资源请求都要基于这个代理路径。
比如针对端口45740,手动编写的script标签应该是这样的:
<script src="https://example.com/proxy/45740/static/js/bokeh.min.js" root_url="https://example.com/proxy/45740/" id="bokeh-script"></script>
如果是用Python的components函数生成嵌入代码,要在调用时传入root_url参数:
from bokeh.embed import components # 假设your_bokeh_doc是你的Bokeh文档对象 script, div = components(your_bokeh_doc, root_url="https://example.com/proxy/45740/")
这样生成的script标签会自动包含正确的root_url属性,确保所有静态资源(比如JS、CSS)和WebSocket连接都指向代理后的路径。
2. 启动Bokeh Server时添加--prefix参数
光前端设置还不够,后端的Bokeh Server也需要识别这个代理前缀,这样它才能正确处理来自/proxy/<port>/路径的请求。启动命令要加上--prefix:
bokeh serve --port 45740 --prefix /proxy/45740/ your_app.py
这个参数会让Bokeh Server把所有请求的路径都加上/proxy/45740/前缀,和nbserverproxy的代理规则匹配。
为什么之前的标签不生效?
之前的script标签没有指定root_url,Bokeh会默认使用当前页面的根路径(比如/)来拼接资源地址,导致请求变成/static/js/...而不是/proxy/45740/static/js/...,自然就无法正确加载资源了。
只要同时做好前端root_url和后端--prefix的配置,就能让所有资源请求和WebSocket连接都完美适配nbserverproxy的代理路径啦!
内容的提问来源于stack exchange,提问作者tam203

