无法在 R plotly 包生成的 Flask 交互式 html 输出中呈现

Unable to render in flask interactive html outputs produced by R plotly package

所以我正在使用 python flask 开发一个 Web 应用程序,该应用程序要求用户提供数据,使用 BLAST 和 R 在后端分析数据,并输出存储在中的交互式 HTML 图本地位置(模板)并显示给用户。

直到 R 输出的一切都运行顺利。我已经打开 HTML 文件并按预期确认 R 代码 运行 并且生成的图形是交互式的。但是,当我通过 flask 呈现这些 HTML 时,浏览器 returns 成为黑页。使用 send_file 也无法显示绘图。我已确认交互式绘图的 Java 脚本的路径位于同一文件夹中。

通过开发人员工具控制台读取以下错误:

htmlwidgets.js:1 Uncaught SyntaxError: Unexpected token <
jquery.min.js:1 Uncaught SyntaxError: Unexpected token <
datatables.js:1 Uncaught SyntaxError: Unexpected token <
jquery.dataTables.min.js:1 Uncaught SyntaxError: Unexpected token <

有人可以建议如何成功地让交互式 R HTML 输出显示在 flask 中吗?

当您使用 send_filesend_from_directory 时,您还需要提供绘图所需的 JavaScript 库,这可能是空白页的原因。

render_template也是如此,但根据错误消息,您的 JS 库似乎也被渲染为模板,并且添加了一些 <> 字符或删除。

试试下面对我有用的代码片段,也许会给你一个好的开始。


一个非常简单的 R 脚本,用于创建带有 Plotly 绘图的独立 HTML 文件。在 /tmp 目录中创建了一个名为 test.html 的文件。所有 JavaScript 个库和 CSS 个文件都在 /tmp/test_files.

library(plotly)
library(htmlwidgets)

myData <- data.frame(x=c(1,2,3), y=c(3,2,1))
local_path <- '/tmp/'
ply <- plot_ly(myData, x = ~x, y = ~y, type='scatter', mode='markers+line')
saveWidget(widget=ply, file=paste(local_path, "test.html", sep=""), selfcontained = FALSE)

用于情节和 JavaScript 库的最小 Flask 服务器片段如下。启动 Flask 并在浏览器中转到 http://localhost:5000/ 将显示绘图并提供所有需要的库。

from flask import Flask
from flask import send_from_directory
app = Flask(__name__)

@app.route('/')
def plotly():
    return send_from_directory('/tmp/', 'test.html')

@app.route('/test_files/<path:path>')
def send_js(path):
    return send_from_directory('/tmp/test_files', path)