里程碑式更新!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应用开发的干货内容,欢迎持续关注我们❤️

相关推荐
tang777893 小时前
分布式爬虫优化指南:如何用代理IP把采集效率提升300%
分布式·爬虫·python·tcp/ip·分布式爬虫·爬虫代理·代理ip
gwf2163 小时前
Soft-RoCE与Soft-iWARP深度解析:无硬件RDMA学习环境搭建(零基础必知必会)
人工智能·python·tcp/ip·tcp·tcpdump
AI行业学习4 小时前
Claude Code + cc-switch + Git + Node.js 一站式完整安装配置教程【8.3】
git·python·安全·前端框架·node.js·html·notepad++
AI行业学习4 小时前
Claude Code + cc-switch + Git + Node.js 一站式完整安装配置教程(2026最新·国内可用版)
人工智能·git·python·安全·node.js·html·notepad++
denggun123454 小时前
大大模型 如何通过 本地排雷 远端GPU
python·embedding·pip
IT小盘4 小时前
16-Prompt版本管理-从手工修改到可追踪配置系统
开发语言·人工智能·python·prompt
卷无止境4 小时前
Python进程池那些事儿:从原理到实战
后端·python
满怀冰雪4 小时前
15-Paddle 高层 API 入门:paddle.Model 的训练与评估流程
人工智能·python·深度学习·机器学习·paddle
johnny2334 小时前
Python生态调试库:IceCream、birdseye、peek、qj、crab_dbg、spewer
python
鸿芯微控科技4 小时前
MFC气体转换系数怎么用?标定气体、换算方向与Python批量计算
c++·python·mfc