首页 » 软件开发 » Python网页应用开发神器Dash新版本介绍(回调函数神器新版本版本)

Python网页应用开发神器Dash新版本介绍(回调函数神器新版本版本)

落叶飘零 2024-07-23 23:15:57 0

扫一扫用手机浏览

文章目录 [+]

本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master

大家好我是费老师,不久前Dash发布了其2.17.0版本,执行下面的命令进行最新版本Dash的安装:

pip install dash -U

2.17版本中新增了多项重要的新功能,使得我们在开发Dash应用功能时更加的得心应手,下面我们就来一起get其中的重点:

Python网页应用开发神器Dash新版本介绍(回调函数神器新版本版本) 软件开发
(图片来自网络侵删)

1 回调函数允许无Output目标

在之前版本的Dash中定义回调函数,「基本准则」之一就是回调函数中必须要编排Output目标,否则在debug模式下访问应用会有下图所示的提示信息:

而从2.17版本开始,允许定义无Output角色的回调函数,这在诸如日志搜集等不一定需要Output的场景下很受用,简单的示例如下:

app1.py

import dashfrom dash import htmlimport feffery_antd_components as facfrom dash.dependencies import Inputapp = dash.Dash(__name__)app.layout = html.Div( [fac.AntdButton("示例按钮", id="demo-button", type="primary")], style={"padding": 50},)@app.callback(Input("demo-button", "nClicks"))def no_output_callback(nClicks): print(f"nClicks: {nClicks}")if __name__ == "__main__": app.run(debug=True)2 后端回调函数新增set_props()方法

在Dash的上一个版本(2.16)中,为「浏览器端回调」新增了set_props()方法,使得我们可以在「浏览器端」自由灵活的更新指定组件的属性值。

而从2.17版本开始,等价的set_props()方法亦可在后端回调函数中使用,其第一个参数component_id用于定义目标组件id,第二个参数props接受字典型输入,用于以键值对的形式更新单个或多个属性值,配合回调函数无需Output的新特性,可以实现很多灵活自由的功能逻辑。

值得注意的事,set_props()在常规回调函数和background回调函数中具有不同的更新时机:

常规回调函数中使用set_props()

对于常规回调函数,在函数体内部执行的若干次set_props(),将会在每次回调函数「执行完成后」统一同时反馈更新到前端,下面是一个简单的例子:

app2.py

import dashfrom dash import html, set_propsimport feffery_antd_components as facfrom dash.dependencies import Inputapp = dash.Dash(__name__)app.layout = html.Div( [ fac.AntdButton("翻转颜色", id="reverse-color", type="primary"), fac.AntdRow( [ fac.AntdCol(id="left-block", span=12, style={"background": "white"}), fac.AntdCol(id="right-block", span=12, style={"background": "black"}), ], style={"height": 500}, ), ], style={"padding": 50},)@app.callback(Input("reverse-color", "nClicks"))def reverse_color(nClicks): if nClicks % 2 == 0: set_props("left-block", {"style": {"background": "white"}}) set_props("right-block", {"style": {"background": "black"}}) else: set_props("left-block", {"style": {"background": "black"}}) set_props("right-block", {"style": {"background": "white"}})if __name__ == "__main__": app.run(debug=True)background回调函数中使用set_props()

与常规回调函数不同,在background回调函数运行的过程中执行的set_props(),会即时的反馈更新到前端中:

app3.py

import dashimport timeimport diskcacheimport feffery_antd_components as facfrom dash.dependencies import Inputfrom dash import html, set_props, DiskcacheManagercache = diskcache.Cache("./cache")background_callback_manager = DiskcacheManager(cache)app = dash.Dash(__name__, background_callback_manager=background_callback_manager)app.layout = html.Div( [ fac.AntdButton( "执行任务", id="execute-task", type="primary", autoSpin=True, loadingChildren="执行中", ), fac.AntdFormItem( fac.AntdProgress(id="task-progress", percent=0, style={"width": 300}), label="任务进度", ), ], style={"padding": 50},)@app.callback(Input("execute-task", "nClicks"), background=True, interval=500)def execute_task(nClicks): for i in range(1, 6): set_props("task-progress", {"percent": i 20}) time.sleep(1) set_props("execute-task", {"loading": False})if __name__ == "__main__": app.run(debug=True)3background回调功能增强

从2.17版本开始,针对background回调函数中的running、progress、cancel目标,新增了对字典型id格式的支持,具体的功能使用我将在后续专门针对background回调函数的文章中做详细介绍,本文不多赘述。

4 新增自定义服务接口快捷注册功能

新版本中额外增加了add_startup_route()方法,其第一个参数name用于设置对应接口的路由地址,第二个参数view_func用于传入对应的视图函数,第三个参数methods以列表形式传入对应的http请求方法类型(取值在'GET'、'POST'中),直接来看一个简单的例子,下图展示的,就是我们快捷注册到Dash应用中的额外自定义服务接口,其自动被添加上/_dash_startup_route前缀:

app4.py

import dashimport timefrom dash import htmldef demo_api(): return {"now": time.time()}# 在Dash对象实例化前添加自定义接口dash.Dash.add_startup_route("demo-api", demo_api, ["GET"])app = dash.Dash(__name__)app.layout = html.Div("测试")if __name__ == "__main__": app.run(debug=True)5layout可接受列表型输入

在过往版本的Dash中,app.layout只接受单个组件,或返回单个组件的函数,从2.17版本开始,直接赋值由组件构成的列表也被允许,譬如:

app.layout = [html.Div("测试")]

完整的更新内容说明请移步https://github.com/plotly/dash/releases/tag/v2.17.0。

标签:

相关文章

语言中的借用,文化交融的桥梁

自古以来,人类社会的交流与发展离不开语言的传播。在漫长的历史长河中,各民族、各地区之间的文化相互碰撞、交融,产生了许多独特的语言现...

软件开发 2025-01-01 阅读1 评论0

机顶盒协议,守护数字生活的新卫士

随着科技的飞速发展,数字家庭逐渐走进千家万户。在这个时代,机顶盒成为了连接我们与丰富多彩的数字世界的重要桥梁。而机顶盒协议,作为保...

软件开发 2025-01-01 阅读1 评论0

语言基础在现代社会的重要性及方法步骤

语言是人类沟通的桥梁,是社会发展的基础。语言基础作为语言学习的基石,对于个人、社会乃至国家的发展具有重要意义。本文将从语言基础在现...

软件开发 2025-01-01 阅读2 评论0

粤语电影,传承文化,点亮时代之光

粤语电影,作为中国电影产业的一朵奇葩,以其独特的地域特色、丰富的文化内涵和鲜明的艺术风格,赢得了广大观众的喜爱。本文将从粤语电影的...

软件开发 2025-01-01 阅读5 评论0

苹果游戏语言,塑造未来娱乐体验的基石

随着科技的飞速发展,游戏产业逐渐成为全球娱乐市场的重要支柱。在我国,游戏产业更是蓬勃发展,吸引了无数玩家和投资者的目光。而在这其中...

软件开发 2025-01-01 阅读1 评论0