无法渲染由R plotly包生成的烧瓶交互式html输出

时间:2017-02-15 04:16:44

标签: python r flask plotly

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

R输出以外的所有内容都可以顺利运行。我打开了HTML文件并确认R代码按预期运行,生成的图形是交互式的。但是,当我通过flask呈现这些HTML时,浏览器会返回黑页。使用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中吗?

1 个答案:

答案 0 :(得分:0)

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

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

请尝试以下适用于我的代码段,也许会为您提供一个良好的开端。

一个非常简单的R脚本,用于创建带有Plotly图的独立HTML文件。在test.html目录中创建名为/tmp的文件。所有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服务器代码段。启动烧瓶并进入浏览器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)