как предотвратить повторную загрузку формы в обратном вызове dash

#forms #plot #callback #nested #plotly-dash

Вопрос:

У меня есть приложение dash для загрузки формы и графика на основе параметров.

Я использую обратный вызов для загрузки параметров формы, так как для извлечения данных из базы данных требуется некоторое время.

Он будет иметь начальный график с использованием параметров по умолчанию. После первой загрузки, когда пользователь меняет параметры, он должен обновить график. Однако он также перезагружает саму форму, а это не то, что я хочу. Но я не знаю, как остановить повторную загрузку формы.

Коды следующие:

 import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
import time
from dash.dependencies import Input, Output, State

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

app.layout = html.Div([
  dcc.Loading(
    children=html.Div(
    id=‘form’,
  )),

  html.Div(id='project-id')
])

@app.callback(dash.dependencies.Output(‘form’, ‘children’),
              dash.dependencies.Input(‘project-id’, ‘children’)
 )

def load_form(project_id):
   time.sleep(2) # indicate it takes some time to load the data, it takes the 
    #project id to create the tissues, for simplicity, i use a simple list 
    #instead
   tissues = [‘A’,‘B’,‘C’]
   return (
       dbc.Form(
         children=dbc.FormGroup([
                  dbc.Label(‘Tissue’,html_for=‘tissue’),
         dcc.Dropdown(
          options=[
            {‘label’: c, ‘value’: c} for c in tissues
           ] ,
          id=‘tissue’,
          value=‘A’
         )
      ])
     ),
     dcc.Loading(
       children=html.Div(
       id=‘my-plot’
     )
   ),
  )

@app.callback(dash.dependencies.Output(‘my-plot’, ‘children’),
             [dash.dependencies.Input(‘tissue’, ‘value’)])
def load_plot(tissue):
   time.sleep(2) # it takes the tissue and generate a plot, here 
        #i use text 
                 # to represent the changes in tissue
  return html.Div([
       html.H1('you choose ’   tissue)
    ])

if name == ‘main’:
    app.run_server(port=8882, debug=True)
 

Идея заключается в следующем: есть форма, затем основывайтесь на параметрах формы для загрузки графика, здесь я просто использую текст для замены, чтобы построить график для простоты.

Когда я запускаю описанные выше сценарии, сначала он загружается нормально. Тем не менее, когда я изменю опцию выпадающего списка, я ожидаю, что форма( id= «форма») останется, перезагрузится только сюжет(id= «мой-сюжет»), т. е. первый ответный звонок только один раз. Но это не так, и форма, и сеанс my-plot перезагружены. Это очень странно.

Как я могу заставить форму загружаться только один раз?

Любые советы очень приветствуются.

Заранее благодарю! Гринфилд