Python網頁應用開發神器Dash 2.18.1穩定版本來啦

费弗里發表於2024-09-13

本文示例程式碼已上傳至我的Github倉庫:https://github.com/CNFeffery/dash-master

Gitee同步倉庫地址:https://gitee.com/cnfeffery/dash-master

  大家好我是費老師,上週Dash釋出了2.18.0新版本,並於今天釋出了可穩定使用的2.18.1版本(自古.1版本最穩✌),今天的文章中就將針對2.18.1穩定版本中已修復的問題及調整的內容做簡要介紹。

  終端執行下列命令將Dash升級到最新版本:

pip install dash -U
Python網頁應用開發神器Dash 2.18.1穩定版本來啦

1 修復了回撥返回單個no_update進行批次控制不生效的問題

  在2.18.0之前的版本中,針對編排了多個Output角色的回撥函式,若我們希望在某些條件分支下,取消本次回撥觸發對所有Output角色的更新,常用的方式是直接return dash.no_update,這裡的單個dash.no_update就可以直接快捷概括對所有Output的不更新。

  舉個簡單的例子,我們透過按鈕的點選來觸發3個不同目標內容的更新,且當點選次數為偶數時取消更新,在之前的2.18.0版本中,這個快捷寫法會觸發下圖所示錯誤:

Python網頁應用開發神器Dash 2.18.1穩定版本來啦

  2.18.1版本中則對此問題進行了修復,可以看到功能正常了,即只有點選次數為奇數時才更新內容:

Python網頁應用開發神器Dash 2.18.1穩定版本來啦

本例子完整程式碼:

app1.py

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__)

app.layout = html.Div(
    [
        fac.AntdSpace(
            [
                f"Dash版本: {dash.__version__}",
                fac.AntdButton("點我試試", id="demo-button", type="primary"),
                fac.AntdText(id="demo-output1"),
                fac.AntdText(id="demo-output2"),
                fac.AntdText(id="demo-output3"),
            ],
            direction="vertical",
            align="center",
        )
    ],
    style=style(padding=50),
)


@app.callback(
    [Output(f"demo-output{i}", "children") for i in range(1, 4)],
    Input("demo-button", "nClicks"),
    prevent_initial_call=True,
)
def demo_callback(nClicks):
    # 僅在nClicks為奇數時觸發
    if nClicks % 2 == 1:
        return (
            f"nClicks: {nClicks}",
            f"nClicks x 2: {nClicks*2}",
            f"nClicks x 3: {nClicks*3}",
        )

    # 不更新任何內容
    return dash.no_update


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

2 修復了全域性/區域性回撥函式錯誤處理機制+字典化角色編排時的異常

  Dash 2.18版本新特性介紹一文中我們介紹了Dash2.18.0開始新增的全域性/區域性回撥錯誤處理機制,但此特性在結合回撥函式字典化角色編排時,會功能異常,譬如我們將上面例子中的回撥函式改造為字典化編排的形式:

# 這裡on_error簡單寫個匿名函式示意
app = dash.Dash(__name__, on_error=lambda e: print(e))

...

@app.callback(
    output=dict(
        demo_output1=Output("demo-output1", "children"),
        demo_output2=Output("demo-output2", "children"),
        demo_output3=Output("demo-output3", "children"),
    ),
    inputs=dict(nClicks=Input("demo-button", "nClicks")),
    prevent_initial_call=True,
)
def demo_callback(nClicks):
    # 僅在nClicks為奇數時觸發
    if nClicks % 2 == 1:
        return dict(
            demo_output1=f"nClicks: {nClicks}",
            demo_output2=f"nClicks x 2: {nClicks*2}",
            demo_output3=f"nClicks x 3: {nClicks*3}",
        )

    # 故意觸發錯誤
    raise Exception("自定義錯誤")

  在之前的2.18.0版本中,錯誤處理遇上字典化角色編排就會出現多餘的錯誤:

Python網頁應用開發神器Dash 2.18.1穩定版本來啦

  而在2.18.1中,此問題得到了有效修復,可以看到,示例中正常捕獲到了錯誤:

Python網頁應用開發神器Dash 2.18.1穩定版本來啦

3 開始棄用舊的run_server()方法

  Dash早期啟動應用的方式為app.run_server(),後面新增了更推薦的app.run()方式。而從2.18.1版本開始,正式將app.run_server()標記為廢棄方法,並將在未來的Dash3.0版本中正式移除此方法,大家統一換成app.run()即可。

  除此之外,此次版本更新中還對dash.Dash()中的pluginslong_callback_manager引數標記為廢棄,完整的更新內容說明請移步https://github.com/plotly/dash/releases/tag/v2.18.1


  以上就是本文的全部內容,對Dash應用開發感興趣的朋友,歡迎新增微訊號CNFeffery,備註“dash學習”加入我們的技術交流群,一起成長一起進步。

相關文章