1简介这是我的《Python+Dash快速Web应用开发》系列教程的第十五期。更详细地介绍了基本概念。如果你仔细学习了前面的教程,那么我相信你有能力开发出今天初具规模的Dash应用。在达世币生态系统中,还有一系列特殊但非常实用的组件。在今天的文章中,我们将了解这些常用的“特殊组件”。图12Dash中常用的特殊功能组件2.1使用Store()存储数据dash_core_components中有很多特殊功能组件,Store()就是其中之一,它的功能很简单,就是用来存储数据的,例如Store一些基本数据类型,例如数字和字符串,或者将Python中的列表和字典存储为json格式的数据。除了id,Store()的主要参数/属性还有:data,代表存储的数据,也是我们写回调函数时要注意的属性;modified_timestamp,用于记录数据属性最后一次被修改的时间戳,一般不用;storage_type,用于设置存储数据的生命周期,有3种,storage_type='memory',生命周期最短,只要刷新页面,数据就会回到初始状态;storage_type='session',只有当浏览器关闭时数据才会被重置;当最后一个storage_type='local'时,数据会存储在本地缓存中,只有手动清除数据才会被重置。话不多说,直接来看一个直观的例子:app1.pyimportdashimportdash_core_componentsasdccimportdash_bootstrap_componentsasdbcfromdash.dependenciesimportInput,Outputapp=dash.Dash(__name__)app.layout=dbc.Container([dbc.Form([dbc.FormGroup([dbc.LabGroup([dbc.LabGroup('storage="memory"时'),dbc.Input(id='input-memory1',autoComplete='off'),dbc.Input(id='input-memory2',style={'margin-top':'3px'}),dcc.Store(id='data-in-memory')]),dbc.FormGroup([dbc.Label('storage="session"时'),dbc.Input(id='input-session1',autoComplete='off'),dbc.Input(id='input-session2',style={'margin-top':'3px'}),dcc.Store(id='data-in-session',storage_type='session')]),dbc.FormGroup([dbc.Label('storage="local"时'),dbc.Input(id='input-local1',autoComplete='off'),dbc.Input(id='input-local2',style={'margin-top':'3px'}),dcc.Store(id='data-in-local',storage_type='local')]),])],style={'margin-top':'100px','max-width':'600px'})#memory对应回调@app.callback(Output('data-in-memory','data'),输入('输入内存1','value'))defdata_in_memory_save_data(value):ifvalue:returnvaluereturndash.no_update@app.callback(Output('input-memory2','placeholder'),Input('data-in-memory','data'))defdata_in_memory_placeholder(data):ifdata:returndatareturndash.no_update#session对应回复@app.callback(Output('data-in-session','data'),Input('input-session1','value'))defdata_in_session_save_data(value):ifvalue:returnvaluereturndash.no_update@app.callback(Output('input-session2','placeholder'),Input('data-in-session','data'))defdata_in_session_placeholder(data):ifdata:returndatareturndash.no_update#local对应用回调@app.callback(Output('data-in-local','data'),Input('input-local1','value'))defdata_in_local_save_data(value):ifvalue:returnvaluereturndash.no_update@app.callback(输出('input-local2','placeholder'),Input('data-in-local','data'))defdata_in_local_placeholder(data):ifdata:returndatareturndash.no_updateif__name__=='__main__':app.run_server(debug=True)可以看到,不同存储参数对应的数据,生命周期有很大的区域:图2借助Store()这个免费存储数据的特性,Store()可以帮助我们完成很多非常实用的功能,我们将在本文最后一个例子中展示2.2使用Interval()实现周期性回调也是dash_core_components中的一个组件,该函数的Interval()也很有趣。它可以帮助我们实现周期性的自动回调,比如开发一个实时股价系统,定时从后台获取最新数据,无需我们手动刷新页面。它的主要参数/属性有:n_intervals,Interval()的核心属性,所谓自动更新,其实就是n_intervals的自动递增过程;interval,数值类型,用于设置n_intervals的值每毫秒递增一次,默认为1000即1秒;max_intervals,int型,用于设置递增的次数,不再自动继续更新,默认-1即无限制;disabled,bool类型,默认为False,用于设置是否停止增量更新过程,如果max_intervals控制的过程是for循环,disabled是while循环。我们可以用它来编写自己的逻辑,在一定条件下停止Interval()的递增过程。下面我们以一个伪造数据的股价实时更新系统的例子来进一步理解Interval()的功能:[html.Strong('贵州茅台(600519)'),'最新股价:',html.Span('2108.94',id='latest-price')]),dcc.Interval(id='demo-interval',interval=1000)],style={'margin-top':'100px'})@app.回调([输出('最新价格','儿童'),输出('最新价格','风格')],输入('演示间隔','n_intervals'),状态('最新价格','children'))deffake_price_generator(n_intervals,latest_price):fake_price=float(latest_price)+np.random.normal(0,0.1)iffake_price>float(latest_price):returnf'{fake_price:.2f}',{'color':'red','background-color':'rgba(195,8,26,0.2)'}eliffake_price
