Proxy 使用autoload.js为bokeh中的静态资源路径定义前缀

Proxy 使用autoload.js为bokeh中的静态资源路径定义前缀,proxy,bokeh,Proxy,Bokeh,我有一个服务,可以像这样启动Bokeh服务器实例: server = Server({"/": app}, io_loop=loop, port=port, allow_websocket_origin=['localhost:%d'%port, origin, self.request.host]) 此服务在代理之后运行,因此客户端只能通过example.com/proxy访问localhost:/// 我正在尝试返回一个脚本标记,该标记将加载我的bokeh应用程序,确保从example.

我有一个服务,可以像这样启动Bokeh服务器实例:

server = Server({"/": app}, io_loop=loop, port=port, 
allow_websocket_origin=['localhost:%d'%port, origin, self.request.host])
此服务在代理之后运行,因此客户端只能通过example.com/proxy访问localhost:///

我正在尝试返回一个脚本标记,该标记将加载我的bokeh应用程序,确保从example.com/proxy请求资源//

目前,我生成此标记,如下所示:

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上运行的bokeh,其呈现如下内容:

<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>
此标记将正确返回一些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/”

我已尝试使用前缀arg启动服务器,如:

服务器{/:app},前缀=/proxy/%s%port,io\u loop=loop,port=port,allow\u websocket\u origin=['localhost:%d'%port,origin,self.request.host]

这不起作用,因为代理在到达bokeh服务器之前去掉了/proxy/前缀,所以它不会传递给bokeh服务器,bokeh服务器会给出404,因为它希望所有路径都使用这个前缀


有什么解决办法吗

这是prefix的预期用途,nbserverproxy的自动行为似乎很不幸

一种可能的解决方案可能是让代理直接为BokehJS资源服务,而不是让Bokeh服务器来完成。许多代理都针对静态资源进行了优化,这也减少了Bokeh服务器上的负载,这可能与您的情况有关

我对nbserverproxy一无所知,但您可以看到旧版本的site是如何使用nginx实现的:

要点是:将BokehJS文件复制到某个本地目录,并将代理配置为将该目录作为https://example.com/static/