里程碑式更新!Dash 4.2新版本新增websocket型回调

更多Dash应用开发干货知识、案例,欢迎关注"玩转Dash"微信公众号👇

1 简介

大家好我是费老师Dash作为流行的Python全栈应用开发 框架,于近日刚发布了其4.2.0正式版本,在本次新版本中,新增了颇具里程碑✨意义的websocket型回调函数机制,使得我们可以在Dash应用回调函数逻辑的编写过程中,通过相关方法在服务端回调函数计算过程中,随时随地 对客户端进行数据传输&控制更新,极大程度上提升了在Dash中开发各种应用功能的能力上限🚀🚀🚀。

今天的文章中,我们就对4.2新版本中最重要的新特性------websocket型回调函数进行简要介绍😉。

2 新版Dash中的websocket型回调

2.1 升级Dash

终端执行下列命令完成新版本Dash的安装升级,这里我们指定额外安装fastapi后端相关依赖,以完美支持新型websocket回调:

bash 复制代码
pip install dash[fastapi] -U

2.2 在Dash应用中使用websocket型回调

首先,我们需要在应用实例化对应的dash.Dash()中设置参数backend="fastapi",这是令Dash应用底层完美开启websocket通信的必要前提。

python 复制代码
app = dash.Dash(__name__, backend="fastapi")

在此基础上,只需要在对应常规服务端回调函数的callback()中设置websocket=True,该服务端回调函数底层网络通信就会从默认的http传输,切换为高性能websocket传输,下面是一个简单的例子:

python 复制代码
import dash
from dash import html
import feffery_antd_components as fac
from feffery_dash_utils.style_utils import style
from dash.dependencies import Input, Output

app = dash.Dash(__name__, backend="fastapi")

app.layout = html.Div(
    [
        fac.AntdSpace(
            [
                fac.AntdInput(id="input", placeholder="请输入内容"),
                fac.AntdText(id="output"),
            ]
        )
    ],
    style=style(padding=50),
)


@app.callback(Output("output", "children"), Input("input", "value"), websocket=True)
def basic_demo(input_text):

    return input_text


if __name__ == "__main__":
    app.run(debug=True)

切换为websocket通信模式后,除了响应延时 上的显著提升⚡以外,更重要的是,借助websocket双向通信的特点,新版本Dash中,可以实现在回调函数里随时随地 与前端界面进行数据获取&更新,下面我们简单举几个例子:

2.2.1 在websocket回调中实时更新应用

基于新型websocket回调,我们可以在回调函数中配合set_props(),实时更新相关组件属性,譬如下面的实时进度条更新示例:

python 复制代码
import dash
import time
from dash import html, set_props
import feffery_antd_components as fac
from feffery_dash_utils.style_utils import style
from dash.dependencies import Input

app = dash.Dash(__name__, backend="fastapi")

app.layout = html.Div(
    [
        fac.AntdSpace(
            [
                fac.AntdButton(
                    "执行任务",
                    id="execute",
                    loadingChildren="执行中",
                    type="primary",
                    autoSpin=True,
                ),
                fac.AntdProgress(id="progress", percent=0, style=style(width=200)),
            ]
        )
    ],
    style=style(padding=50),
)


@app.callback(Input("execute", "nClicks"), websocket=True, prevent_initial_call=True)
def update_progress(nClicks):

    for i in range(10):
        time.sleep(0.25)  # 模拟计算耗时
        set_props("progress", {"percent": (i + 1) * 10})

    set_props("execute", {"loading": False})


if __name__ == "__main__":
    app.run(debug=True)

2.2.2 在websocket回调中实时获取组件属性

更高级的是,基于新型websocket回调函数,我们还可以在回调函数中,实时获取 任意指定id组件对应的任意属性值(在异步回调函数中使用),譬如下面的例子,我们没有事先在回调函数编排中声明两个输入框角色,但基于get_prop()就可以在回调函数运行的过程中,即时获取想要的属性值:

python 复制代码
import dash
from dash import html
import feffery_antd_components as fac
from feffery_dash_utils.style_utils import style
from dash.dependencies import Input

app = dash.Dash(__name__, backend="fastapi")

app.layout = html.Div(
    [
        fac.AntdSpace(
            [
                fac.AntdButton("触发回调", id="trigger", type="primary"),
                fac.AntdInput(id="input1"),
                fac.AntdInput(id="input2"),
            ]
        )
    ],
    style=style(padding=50),
)


@app.callback(Input("trigger", "nClicks"), websocket=True, prevent_initial_call=True)
async def get_prop_demo(nClicks):

    ws = dash.ctx.websocket

    value1 = await ws.get_prop("input1", "value")
    value2 = await ws.get_prop("input2", "value")

    print(value1, value2)


if __name__ == "__main__":
    app.run(debug=True)

凭借这一新特性,我们可以在Dash应用中更加灵活自由地实现各种高级功能逻辑,特别是对实时更新 要求高的功能场景,譬如当下火热的各种AI智能体 实时输出功能等,接下来我们会通过「玩转Dash」公众号&知识社区,分享更多新版Dash+AI的典型场景案例,敬请期待😎。


更多有关Dash应用开发的干货内容,欢迎持续关注我们❤️

相关推荐
STLearner15 小时前
ICML 2026 | LLM×Graph论文总结[1]【图基础模型,文本属性图,多模态属性图,图对齐,图提示学习,关系深度学习
论文阅读·人工智能·python·深度学习·学习·机器学习·数据挖掘
习明然17 小时前
我的本地化AI项目(三)
人工智能·python·electron·c#·avalonia
喜欢的名字被抢了17 小时前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
夏季疯18 小时前
读论文:STARS 是什么结构?一个统一的歌声自动标注框架
python
光测实验室19 小时前
3种Python降噪算法实测:我把处理速度提升了20倍
python
AOwhisky19 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
爱吃提升19 小时前
Python桌面自动化PyAutoGUI完整实战教程:模拟鼠标键盘、窗口操作、图形识别自动化
python·自动化·计算机外设
花花无缺20 小时前
Windows 定时执行 Python 脚本方案
python·操作系统·命令行
流云鹤1 天前
1. 配置环境、创建导航栏
python·django
三亚兴嘉装饰1 天前
准备在三亚装房子找哪家装修
python