You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动