Python全栈应用开发利器Dash 3.x新版本介绍(2)

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

大家好我是费老师,在上一期文章中,我们针对Python生态中++强大++ 且++灵活++ 的全栈应用开发 框架Dash,介绍了其3.x新版本中的部分更新内容🧐。

今天的文章中,我们继续介绍3.x新版本Dash中的更多更新内容 ,进一步提升使用Python+Dash进行全栈应用开发的效率~

1 Input、State回调角色编排新增allow_optional参数

我们都知道,在Dash中,回调函数 是关联不同组件,实现各种灵活交互功能的关键。

但在编写一些较复杂 回调函数逻辑时,部分同学对参与回调函数的部分组件渲染顺序 控制不当,导致回调函数触发时,部分InputState角色尚未渲染在页面中 ,这在debug模式下会在前端弹出以A nonexistent object was used in开头的错误提示。

譬如下面的例子,输入框2 需要点击按钮后才会渲染在页面中,因此对应show_inputs()回调函数提前触发时,作为Input角色之一的输入框2并不存在,就会导致相关错误出现:

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

app = dash.Dash(__name__, suppress_callback_exceptions=True)

app.layout = html.Div(
    [
        fac.AntdSpace(
            [
                fac.AntdButton("渲染输入框2", id="render-input", type="primary"),
                fac.AntdInput(id="input1", placeholder="输入框1"),
                fac.Fragment(id="input2-container"),
                fac.AntdText(id="inputs-content"),
            ]
        )
    ],
    style=style(padding=50),
)


@app.callback(
    Output("input2-container", "children"),
    Input("render-input", "nClicks"),
    prevent_initial_call=True,
)
def render_input2(nClicks):
    return fac.AntdInput(id="input2", placeholder="输入框2")


@app.callback(
    Output("inputs-content", "children"),
    Input("input1", "value"),
    Input("input2", "value"),
)
def show_inputs(input1, input2):
    return f"输入框1: {input1}, 输入框2: {input2}"


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

针对这个场景,3.x版本中为Input()State()角色编排添加了allow_optional参数,当设置allow_optional=True时,对应的InputState角色即使当前不存在,也不会报错终止回调逻辑,而是以空值作为缺省值

作用效果如下:

妥善利用此项新特性,我们就可以更轻松地处理相关场景啦~

2 dash.Dash()新增assets_path_ignore参数

熟悉Dash应用开发的朋友应该知晓,对于应用项目默认的静态资源目录assets,其内部的所有.css.js文件,都会在用户访问应用时全部自动加载并生效 ,譬如下面的简单例子,assets目录下demo_folder中额外定义的demo.jsdemo.css均在应用中自动生效:

当我们既希望可以直接通过assets/开头的URL访问对应文件资源(譬如assets/demo_folder/demo.css),又不希望应用访问时部分静态资源自动被加载生效时,就可以使用到新版本中为dash.Dash()新增的参数assets_path_ignore,接受列表型输入,用于指定assets哪些路径需要在自动加载机制中被忽略,譬如:

这样设置之后,对应目录下的相关静态资源就不会自动生效啦:

这一点在很多场景下非常实用,譬如离线形式部署Dash+three.js等,有相关Dash应用高级功能开发需求的朋友值得注意。

3 AntdConfigProvider性能大幅优化

熟悉fac组件库的朋友,可能对其中的参数配置 组件AntdConfigProvider有所了解:

3.0版本之前,由于Dash底层渲染机制的原因,导致被AntdConfigProvider组件所包裹的其他组件,在被交互时会额外产生 大量多余的重绘渲染 ,当AntdConfigProvider内部组件众多,譬如直接将整个页面嵌套在AntdConfigProvider中实现主题切换、国际化切换等功能时,会感受到明显的操作卡顿 ,譬如下面的例子(对应Dash版本为2.18.2):

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

app = dash.Dash(__name__)

app.layout = html.Div(
    [
        fac.AntdConfigProvider(
            fac.AntdSpace(
                [fac.AntdSwitch(checkedChildren="打开", unCheckedChildren="关闭")]
                * 2000,
                wrap=True,
            )
        )
    ],
    style=style(padding=50),
)

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

同样的应用在3.x版本中,操作就变得非常丝滑~

基于这项性能 上的重大提升 ,我们就可以在应用中更稳定地实现主题切换国际化切换批量禁用控制等功能~

篇幅有限,更多新版本Dash更新相关内容,接下来的数篇文章我们继续为大家盘点,敬请期待~


以上就是本文的全部内容,对Dash应用开发感兴趣的朋友,欢迎添加微信号CNFeffery,备注"dash学习"加入我们的技术交流群,一起成长一起进步。

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