在 Google Colab 上,来自 Javascript 的 localhost 访问失败
Posted
技术标签:
【中文标题】在 Google Colab 上,来自 Javascript 的 localhost 访问失败【英文标题】:On Google Colab, localhost access from Javascript fails 【发布时间】:2020-12-08 05:57:53 【问题描述】:我有一个 javascript sn-p,我的 Jupyter Notebook 安装到浏览器页面中。它访问在我的 PC 上运行的支持 REST 的交互式应用程序(即 Cytoscape)。
一个来自 Javascript 的 Cytoscape 调用示例是“GET http://localhost:1234/v1/version”...由正常的 xmlHTTPRequest.send() 调用执行。
在其他 Jupyter Notebook 系统(例如 GenePattern Notebook)上,这可以正常工作。查看 Chrome 的网络跟踪,看起来我的 HTTP 调用被拦截了,并且对 colab 的单独调用似乎试图授权调用(???)。以下是 Chrome 在调试控制台中显示的内容:
colab 调用似乎发生在这里:https://colab.research.google.com/v2/external/external_polymer_binary.js?vrz=colab-20200817-085601-RC01_327067882
最后,我的调用似乎被禁止了......我得到一个 HTTP 状态 500。
知道如何说服 colab 让我对本地 Cytoscape 的 Javascript 级调用通过吗?任何信息都会有所帮助。
谢谢!
【问题讨论】:
【参考方案1】:对 Colab 中 localhost
的请求被重定向到 VM 后端。
详情在这里: https://colab.research.google.com/notebooks/snippets/advanced_outputs.ipynb#scrollTo=R8ZvCXC5A0wT
解决方法是将请求定向到 127.0.0.1
而不是主机名 localhost
。仅拦截localhost
请求。
具体来说,此单元将从 Colab 后端 VM 获取:
%%javascript
// Fetches from the backend VM on port 1234.
fetch('http://localhost:1234/')
而此单元格将从运行浏览器的本地计算机获取。
%%javascript
// Fetches from the machine running the browser.
fetch('http://127.0.0.1:1234/')
【讨论】:
哇。我知道了。那么,colab 的安全模型与普通的 Jupyter Notebook 有很大不同吗?我看到单元格输出存在于 iFrame 中,与其他 iFrame 隔离。看起来 Javascript 执行模型完全不同(即不再通过 IPython.notebook.kernel.execute() 传递结果)和内核服务(包括使用 localhost:xxx 从 Javascript 访问)。该模型可能只是意外地断开了与工作站应用程序的本地主机连接……尽管它关闭了您可能想要关闭的漏洞。有什么办法可以打一个洞让我可以访问本地 Cytoscape? 是的,使用127.0.0.1
而不是localhost
。我将更新原始答案以尽快提及这一点。
好消息……这似乎成功了。从现在开始我会使用它。以上是关于在 Google Colab 上,来自 Javascript 的 localhost 访问失败的主要内容,如果未能解决你的问题,请参考以下文章