Streamlit Cloud部署后iframe组件空白无法加载Metabase仪表盘
问题现象
部署在Streamlit Cloud的应用内iframe嵌入的Metabase仪表盘无法正常显示:
- 本地运行Streamlit应用时iframe可正常加载
- Streamlit官方文档提供的示例iframe在Cloud部署环境可正常显示
- 更换浏览器、替换嵌入组件、调整iframe参数、重建应用均无法解决问题
当前使用环境版本:streamlit==1.10.0
复现场景代码如下:
import streamlit.components.v1 as components import streamlit as st st.write("Streamlit Docs Example iframe") components.iframe("https://docs.streamlit.io/en/latest") st.write("different iframe test") components.iframe(src="http://smb-analytics-metabase.herokuapp.com/public/dashboard/afefddda-d5d4-43ed-83fd-307eab7ded3c", width=1285, height=1000, scrolling=True)
已完成的排查操作:
- 使用Chrome、Brave多款浏览器交叉测试
- 用
components.html()替换components.iframe()实现嵌入逻辑 - 移除iframe的宽高、滚动条自定义参数
- 重启应用、删除应用后重新构建部署
问题根因
Streamlit Cloud全站强制使用HTTPS协议,现代浏览器默认启用混合内容拦截规则,禁止HTTPS页面加载HTTP协议的非安全资源。你嵌入的Metabase地址使用HTTP协议,因此被浏览器拦截无法渲染:
- 本地运行Streamlit时默认通过HTTP协议(localhost:8501)访问,不存在跨协议的混合内容拦截,因此iframe可正常显示
- Streamlit官方文档的iframe地址为HTTPS协议,符合浏览器安全规则,因此部署后可正常加载
修复方案
- 优先通用方案:将Metabase服务切换为HTTPS访问。如果Metabase部署在Heroku平台,平台默认已提供HTTPS访问能力,直接将代码中iframe地址的
http://前缀替换为https://,重新部署应用即可正常加载。 - 临时测试方案:如果仅用于个人本地测试,可手动修改浏览器站点权限:点击浏览器地址栏左侧的站点设置按钮,找到「不安全内容」选项,设置为允许后刷新页面即可加载iframe。该方案需要每个访问者手动修改浏览器配置,不适合对外公开的应用。
- 替代方案:在Streamlit后端通过接口请求拉取Metabase仪表盘的静态内容,再通过
components.html()渲染到前端,绕开前端的混合内容拦截,但该方案会丢失Metabase仪表盘的部分交互能力。
内容的提问来源于stack exchange,提问作者Boss Boyd
相关产品推荐
相关产品推荐

