Alon1
(Alon)
1
我知道这超出了大多数社区的范围,但我们是一个科学社区,使用 Python 和大量图表(Matplotlib),我们通过 Discourse 相互共享。\n\n能够共享交互式图表而不是静态 jpg/png 将是惊人的。\n\n考虑这个例子:
import matplotlib.pyplot as plt
import mpld3
import numpy as np
Fs = 4000
f = 100
sample = 200
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
fig, ax = plt.subplots(1,1)
ax.plot(x, y, marker=".")
html_str = mpld3.fig_to_html(fig)
Html_file= open("index.html","w")
Html_file.write(html_str)
Html_file.close()
您将能够打开 index.html 文件,它将显示该内容(只是它将是交互式的……)\n
\n\n所以,我觉得我们已经完成了一半,对吧?\n也许只需上传 html 文件,它就可以在某个 iframe 中运行?
Alteras
(Steven Chang)
2
您描述的方法可以通过自定义插件实现,结合 markdown-it 风格的插件和可能的 HTML 对象存储。但我对让用户输入的代码在服务器上任意运行的安全性持谨慎态度。Discourse 已经做了大量工作来清理帖子中的 HTML 和 JS,以便在后端安全地解析。
您或许可以尝试在浏览器中嵌入一个 Python 解释器,让它在客户端运行代码,从而跳过整个 HTML 创建过程。JupyterLite (JupyterLite — JupyterLite 0.7.0-beta.0 documentation) 允许您在浏览器中运行 JupyterLab,并带有用户界面。从文档来看,您可以让它在 iframe 创建时自动运行代码 (Embed a live REPL on a website — JupyterLite 0.7.0-beta.0 documentation)。您可以提供一个自定义 HighlightJS 插件来为任何 Python 代码块创建一个可操作的按钮,或者让它自动运行。
所以,类似这样:
- 用户看到一个带有 Python 代码块的帖子。
- 用户将鼠标悬停在代码块上,会出现一个按钮,允许他们在浏览器中运行代码。
- 用户点击按钮,在代码块下方创建一个 JupyterLite 的 iframe,并将代码块中的代码导入其中。
由于这只是一个创建 JupyterLite iframe 的 HighlightJS 插件,您可以在主题组件中完成所有操作,无需服务器代码。
请注意:JupyterLite 被描述为功能不完整,不如 JupyterLab 全面,我不确定它如何处理包导入,所以您可能需要自己托管它。 JupyterLite 使用 Pyodide (Pyodide — Version 0.29.0),它支持 PyPI 上的任何 wheel 包,所以应该没问题。
3 个赞
Alon1
(Alon)
3
我认为,如果 index.html 在客户端(用户浏览器上,而不是 Discourse 服务器上)运行,安全风险并不大。
另外,mpld3 方法的优势在于它是一个单一文件,没有依赖项。如果你运行原始 Python,你还必须能够上传所有依赖项,如 csv 文件、数据文件等,这些都是你想绘制的源头。
话虽如此,能够在 Discourse 帖子中运行原始 Python 脚本将是极好的!
2 个赞
Alteras
(Steven Chang)
4
哦!我完全误解了 HTML 的生成方式。如果用户预先生成 HTML,您可以让他们从外部站点 iframe,并将该域列入白名单。
例如,codepen,默认情况下应该允许:
<iframe height="300" width="800" style="width: 100%;" scrolling="no" title="mplD3 example, actually working" src="https://codepen.io/gully/embed/BawMGr?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gully/pen/BawMGr">
mplD3 example, actually working</a> by gully (<a href="https://codepen.io/gully">@gully</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
3 个赞
Alon1
(Alon)
6
太棒了!
我有几个问题:
- 您认为它能与 ipympl 一起使用吗(否则图形将不具有交互性,这将使整个目的无效)?
- 您认为它可以在一个底层项目文件夹中使用,我们可以在启动 Jupyter 之前设置
PYTHONPATH 环境变量,以便用户可以从联合项目中导入函数和依赖项吗?
是的,如果这是合理且可行的,并且可以作为开源项目贡献给整个 Discourse 社区,那么我确实有预算。
2 个赞
Alon1
(Alon)
8
@Alteras 谢谢,这个解决方案非常直接,如果你能找到一种方法将“index.heml”文件上传到 Discourse(可以轻松启用 .html 上传)并在 iframe 代码中提供它,它就能正常工作。唯一的问题是,它实际上并不能正常工作……当我尝试这样做时,它只是下载了 index.html 而不是在 iframe 中渲染它。也许有一个 meta 标签可以告诉 iframe 显示文件而不是下载?
Alteras
(Steven Chang)
9
啊,我明白了。Discourse 默认会将任何非图像附件的 Content-Disposition 设置为“attachment”,这只会将其视为下载。
你也许可以做一些类似 Inline PDF Previews 的事情,它似乎解决了同样的问题,但针对的是 PDF 上传。
1 个赞
system
(system)
关闭
10
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.