我有一个情节破折号服务器。它正在正常提供页面,这是有效的。我在其他系统中有一些其他仪表板,我想从仪表板中提取一些图表,并嵌入为 iframe。
这适用于 Plots,因为它们有一个 to_html() 可以做到这一点。我这里有一个自定义路线,用于将 iframe 与正常页面流分开。
@app.server.route("/iframe/<test_id>")
def serve_iframe(test_id):
# Create a simple bar chart
fig = p_go.Figure(p_go.Bar(x=["D", "E", "F"], y=[10, 20, 15]))
# Convert the figure to HTML
plot_html = fig.to_html(full_html=False, include_plotlyjs="cdn")
return plot_html
这有效。 但是 Datatables 和常规 dash.html.Div() 元素
又如何呢?...
df = pd.DataFrame(table_data)
dataTable = dash_table.DataTable(...)
return dataTable
网住了我
TypeError:视图函数未返回有效响应。返回类型必须是字符串、字典、列表、带有标头或状态的元组、响应实例或可调用的 WSGI,但它是一个 DataTable。
并说我是否要使用 dash-html-components
手动制作该表格 html.Table([ html.Tr()....]
我得到的 html 响应只是类的字符串表示
“表([Tr([Th('')”
我需要这些元素的 to_html() 方法,但不存在?
我是否因为有单独的路线并绕过整个破折号渲染系统而在这里出错了?
我可以将我的“iframe”数据作为实际的破折号页面,然后编写一些代码以在正常使用中向用户隐藏这些数据 - 当直接访问绘图站点时。
所以我在这里有一条单独的路线是不是出了问题?, 我想是对的 - 有效的方法是将我的“嵌入视图”创建为普通页面。 我必须对我的结构进行一些重新设计。由于主应用程序布局功能无法确定它正在服务的页面 - 我曾经在那里有导航栏逻辑,但现在我已将其移至每个页面中。
主应用程序.py
def create_layout() -> html.Div:
# Used to have this
# return html.Div([create_navbar(), dash.page_container])
# but now it does only this
return html.Div([dash.page_container])
在每个页面中,我都想有一个导航栏,我愿意
from app import create_navbar
#important to use layout() function and not 'layout = html.Div(...)'
def layout():
return html.Div(
children=[
create_navbar(),
html.Div([....])
以及我用于 iframe 的任何“嵌入页面”,只是不调用 create_navbar()。
create_navbar() 有:
if not page["name"].startswith("Embed")....
不在其他页面的导航中向用户显示嵌入式页面。
因此,只要嵌入页面有一个返回到绘图服务器的实时链接,这就可以工作,对于我的第一个工作示例来说,无论如何它都必须如此。
我看到了一些使用回调和
dcc.Location(id='url', refresh=False)
来执行此操作的方法,这会在导航栏上设置样式来隐藏它,但这看起来很混乱 - 我将 html 数据发送到外部站点,只是用 css 隐藏它。
我想这里还缺少的是,如果我想将它们导出到静态 html 文件,切断链接并需要运行plotly-dash 服务器。在我的例子中,这些嵌入视图没有用户交互或回调,它是一次性数据抓取和显示。