如何使用FastAPI部署Pyvis交互式分子图谱?
如何使用FastAPI部署Pyvis交互式分子图谱?
好问题!我来分享几个在FastAPI中部署Pyvis交互式分子图谱的实用方案,适配不同的场景需求:
方案1:直接返回预先生成的HTML文件(适合固定图谱场景)
如果你的分子图谱是固定的(比如就用CHEBI:17710的2级子图),最省事的方式就是先把Pyvis图谱生成独立的HTML文件,再用FastAPI直接返回这个文件。
第一步:生成独立的Pyvis HTML文件
先调整你原来的代码,把notebook=True改成False(因为要生成脱离Jupyter的独立HTML),用write_html代替show来保存文件:
import networkx as nx import obonet from pyvis.network import Network # 读取CHEBI本体并生成目标子图 G = obonet.read_obo('https://ftp.ebi.ac.uk/pub/databases/chebi/ontology/chebi_core.obo') H = nx.ego_graph(G, 'CHEBI:17710', 2) # 生成Pyvis交互式图谱,关闭notebook模式 nt = Network('1500px', '1500px', notebook=False) nt.from_nx(H) # 保存为本地HTML文件 nt.write_html('molecular_graph.html')
第二步:用FastAPI托管这个HTML文件
写一个简单的FastAPI接口,直接返回生成好的HTML文件:
from fastapi import FastAPI from fastapi.responses import FileResponse import os app = FastAPI(title="分子图谱探索工具") @app.get("/explore-graph", response_class=FileResponse) async def serve_molecular_graph(): graph_file = "molecular_graph.html" if os.path.exists(graph_file): # 返回HTML文件给前端 return graph_file # 如果文件不存在,返回提示 return {"error": "图谱文件未找到,请先运行生成脚本!"}
启动FastAPI后,访问http://localhost:8000/explore-graph就能看到交互式图谱了。
方案2:动态生成图谱并返回(适合自定义参数场景)
如果你的工具需要支持用户输入不同的分子ID、调整探索深度,那可以把图谱生成逻辑集成到FastAPI接口里,动态生成后直接返回HTML内容。
FastAPI代码示例
from fastapi import FastAPI, HTTPException from fastapi.responses import HTMLResponse import networkx as nx import obonet from pyvis.network import Network import os app = FastAPI(title="动态分子图谱探索工具") # 建议:把CHEBI本体下载到本地,避免每次请求都下载,提升性能 LOCAL_OBO_PATH = "chebi_core.obo" @app.get("/dynamic-graph/{chebi_id}", response_class=HTMLResponse) async def generate_dynamic_graph(chebi_id: str, depth: int = 2): try: # 读取本体文件(优先本地,本地没有再下载) if os.path.exists(LOCAL_OBO_PATH): G = obonet.read_obo(LOCAL_OBO_PATH) else: # 下载本体并保存到本地 G = obonet.read_obo('https://ftp.ebi.ac.uk/pub/databases/chebi/ontology/chebi_core.obo') with open(LOCAL_OBO_PATH, 'wb') as f: f.write(open(LOCAL_OBO_PATH, 'rb').read()) # 校验CHEBI ID是否存在 if chebi_id not in G.nodes: raise HTTPException(status_code=404, detail=f"未找到CHEBI ID:{chebi_id}") # 生成指定的ego子图 H = nx.ego_graph(G, chebi_id, depth) # 生成Pyvis图谱并返回HTML内容 nt = Network('1500px', '1500px', notebook=False) nt.from_nx(H) # 直接生成HTML字符串返回,不用存文件 return nt.generate_html() except Exception as e: raise HTTPException(status_code=500, detail=f"生成图谱失败:{str(e)}")
这个接口支持用户通过URL参数指定CHEBI ID和探索深度,比如访问http://localhost:8000/dynamic-graph/CHEBI:24669?depth=3就能得到对应分子的3级子图。
一些优化小建议
- 缓存本体文件:上面的代码里已经加了本地缓存的逻辑,第一次请求会下载本体,之后直接读本地文件,能大幅提升响应速度。
- 添加前端交互:如果需要更友好的用户体验(比如让用户输入CHEBI ID的表单),可以写一个简单的HTML页面,放在FastAPI的静态文件目录里,前端调用动态接口来渲染图谱。
- 性能优化:如果图谱生成耗时较长,可以考虑用FastAPI的
BackgroundTasks做异步处理,或者缓存生成好的HTML文件,避免重复计算。
备注:内容来源于stack exchange,提问作者Soerendip




