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

相关推荐
兵慌码乱3 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot5 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海10 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱12 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽17 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码17 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱1 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵1 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python