Python 全棧應(yīng)用開發(fā)利器 Dash 3.x 新版本介紹(2)
在上一期文章中,我們針對Python生態(tài)中強(qiáng)大且靈活的全棧應(yīng)用開發(fā)框架Dash,介紹了其3.x新版本中的部分更新內(nèi)容??。
今天的文章中,我們繼續(xù)介紹3.x新版本Dash中的更多更新內(nèi)容,進(jìn)一步提升使用Python+Dash進(jìn)行全棧應(yīng)用開發(fā)的效率~

1. Input、State回調(diào)角色編排新增allow_optional參數(shù)
我們都知道,在Dash中,回調(diào)函數(shù)是關(guān)聯(lián)不同組件,實(shí)現(xiàn)各種靈活交互功能的關(guān)鍵。
但在編寫一些較復(fù)雜回調(diào)函數(shù)邏輯時,部分同學(xué)對參與回調(diào)函數(shù)的部分組件渲染順序控制不當(dāng),導(dǎo)致回調(diào)函數(shù)觸發(fā)時,部分Input或State角色尚未渲染在頁面中,這在debug模式下會在前端彈出以A nonexistent object was used in開頭的錯誤提示。
譬如下面的例子,輸入框2需要點(diǎn)擊按鈕后才會渲染在頁面中,因此對應(yīng)show_inputs()回調(diào)函數(shù)提前觸發(fā)時,作為Input角色之一的輸入框2并不存在,就會導(dǎo)致相關(guān)錯誤出現(xiàn):
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_exceptinotallow=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):
returnf"輸入框1: {input1}, 輸入框2: {input2}"
if __name__ == "__main__":
app.run(debug=True)
針對這個場景,3.x版本中為Input()和State()角色編排添加了allow_optional參數(shù),當(dāng)設(shè)置allow_optinotallow=True時,對應(yīng)的Input或State角色即使當(dāng)前不存在,也不會報錯終止回調(diào)邏輯,而是以空值作為缺省值:

作用效果如下:

妥善利用此項(xiàng)新特性,我們就可以更輕松地處理相關(guān)場景啦~
2. dash.Dash()新增assets_path_ignore參數(shù)
熟悉Dash應(yīng)用開發(fā)的朋友應(yīng)該知曉,對于應(yīng)用項(xiàng)目默認(rèn)的靜態(tài)資源目錄assets,其內(nèi)部的所有.css、.js文件,都會在用戶訪問應(yīng)用時全部自動加載并生效,譬如下面的簡單例子,assets目錄下demo_folder中額外定義的demo.js和demo.css均在應(yīng)用中自動生效:


當(dāng)我們既希望可以直接通過assets/開頭的URL訪問對應(yīng)文件資源(譬如assets/demo_folder/demo.css),又不希望應(yīng)用訪問時部分靜態(tài)資源自動被加載生效時,就可以使用到新版本中為dash.Dash()新增的參數(shù)assets_path_ignore,接受列表型輸入,用于指定assets下哪些路徑需要在自動加載機(jī)制中被忽略,譬如:

這樣設(shè)置之后,對應(yīng)目錄下的相關(guān)靜態(tài)資源就不會自動生效啦:

這一點(diǎn)在很多場景下非常實(shí)用,譬如離線形式部署Dash+three.js等,有相關(guān)Dash應(yīng)用高級功能開發(fā)需求的朋友值得注意。
3. AntdConfigProvider性能大幅優(yōu)化
熟悉fac組件庫的朋友,可能對其中的參數(shù)配置組件AntdConfigProvider有所了解:
文檔地址:https://fac.feffery.tech/AntdConfigProvider

在3.0版本之前,由于Dash底層渲染機(jī)制的原因,導(dǎo)致被AntdConfigProvider組件所包裹的其他組件,在被交互時會額外產(chǎn)生大量多余的重繪渲染,當(dāng)AntdConfigProvider內(nèi)部組件眾多,譬如直接將整個頁面嵌套在AntdConfigProvider中實(shí)現(xiàn)主題切換、國際化切換等功能時,會感受到明顯的操作卡頓,譬如下面的例子(對應(yīng)Dash版本為2.18.2):
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="關(guān)閉")]
* 2000,
wrap=True,
)
)
],
style=style(padding=50),
)
if __name__ == "__main__":
app.run(debug=True)
同樣的應(yīng)用在3.x版本中,操作就變得非常絲滑~

基于這項(xiàng)性能上的重大提升,我們就可以在應(yīng)用中更穩(wěn)定地實(shí)現(xiàn)主題切換、國際化切換、批量禁用控制等功能~
篇幅有限,更多新版本Dash更新相關(guān)內(nèi)容,接下來的數(shù)篇文章我們繼續(xù)為大家盤點(diǎn),敬請期待~

























