如何将含Plotly可视化的Jupyter Notebook转为限权免登录Web应用
方案选型建议
优先选Mercury,别先折腾Voila。Voila本身只负责把Notebook转成可交互网页,不带任何权限控制能力,要做“无登录+指定人可访问”的效果,得自己写鉴权逻辑、配反向代理,新手踩坑概率极高。Mercury原生就带私密链接分享、令牌校验的功能,完美适配Plotly图表,你原来写的Notebook代码几乎不用改,上手成本最低。
Mercury 实操步骤(全程不用改核心绘图代码)
- 第一步:装依赖
在你平时跑这个Notebook的Python虚拟环境里,直接执行安装命令:pip install mercury。尽量和你原来的环境保持一致,避免Plotly、pandas这些包版本不兼容导致图表加载失败。 - 第二步:给Notebook加最小配置
打开你原来的.ipynb文件,在最顶部新建一个原始单元格(Raw NBConvert格式,别选代码/Markdown格式),填下面的基础配置:
这里两个关键参数记一下:--- title: 你的数据看板名称 description: 数据可视化内容说明 show-code: false share: private ---show-code: false会把所有代码单元格藏掉,用户打开只能看到图表、交互控件,和你之前导出的HTML展示效果一致;share: private会关掉公开访问,只有带有效访问令牌的链接才能打开页面。你原来写的Plotly绘图、数据处理逻辑一行都不用动,原来在Notebook里能跑通,转成Web应用就不会出大问题。 - 第三步:本地验证效果
在Notebook所在的文件夹开终端,执行mercury run,启动完成后会自动打开本地页面,你先挨个测一遍Plotly图表的交互:悬停看数、缩放、筛选控件是不是都正常,和你本地Notebook里跑的效果对不对得上。 - 第四步:生成授权访问链接
启动后终端会打印本地管理后台的地址和初始管理员账号密码,登进去找到你刚导入的Notebook应用,在分享设置里可以给每个授权用户单独生成带唯一token的专属链接:- 每个链接自带独立的访问令牌,不用给用户注册账号、不用设密码,用户点链接直接进应用,没有登录环节
- 要是某个用户的访问权限要收回,直接在后台把对应token禁用就行,不影响其他已授权用户的访问
- 你也可以给所有授权用户生成同一个通用带token的链接,适合小范围快速分享的场景
- 第五步:部署到公网
不想自己折腾服务器的话,直接用Mercury的官方托管服务,上传Notebook点一下部署就能拿到公网访问地址,不用自己配域名、SSL、反向代理。有自己内部服务器的话,在服务器上执行mercury run 0.0.0.0:你的端口号,配个端口映射就能在内网/公网访问,不需要额外装其他组件。
选Voila的话要注意的问题
如果你已经熟悉Voila,要实现同样的无登录授权效果,得自己补全鉴权层:
- 先装依赖:
pip install voila - 本地启动命令用
voila 你的notebook路径.ipynb --strip_sources=True,加--strip_sources=True参数可以隐藏所有代码单元格,只展示输出内容 - 鉴权部分需要自己写中间件或者配反向代理规则,校验请求URL里的token参数,只有带你预先设置的合法token的请求才能访问Voila服务,这部分对新手不友好,很容易出现权限绕过的漏洞,没有开发经验的话不推荐走这条路。
新手容易踩的坑
- 别把数据库密码、API密钥这类敏感信息硬编码在Notebook的输出单元格里,哪怕开了隐藏代码的配置,输出单元格的内容用户是能看到的
- 本地数据集、配置文件的路径尽量用相对路径,别写
C:/xxx/xxx.csv这种绝对路径,不然部署到服务器之后会找不到文件报错 - 生成访问令牌的时候别用太简单的字符串(比如123456、test这类),尽量用随机生成的32位以上字符,避免被人暴力猜中绕开访问限制
- 发邮件的时候直接把完整带token的链接粘到正文就行,用户点开直接看图表,比发HTML附件体验好,后续数据更新了也不用反复给用户发新文件。
内容的提问来源于stack exchange,提问作者user9167
相关产品推荐
相关产品推荐

