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

相关推荐
固定资产管理系统软件17 小时前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python
TheBestRucy18 小时前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
lancyu18 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗19 小时前
Claude 使用指南
开发语言·python
工具分享19 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI19 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造19 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏19 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念20 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi21 小时前
0103-python相关-函数、文件
python