在 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 访问失败的主要内容,如果未能解决你的问题,请参考以下文章

使用GOOGLE COLAB训练深度学习模型

在 Google Colab 中使用 Git 的方法

如何在 google colab 中启用拼写检查器(colab 在 linux OS 上运行)?

如何在 Google Colab 上安装和使用底图?

Google Colab 中的空闲 GPU 内存

pip 安装了 google.colab,现在无法在 Jupyter 笔记本上运行代码