개발/Dash

[Dash]Python Dash Callback (2) State

moonzoo 2024. 1. 16. 17:58

Dash Callback State 함수

Dash 콜백 함수에서 State는 콜백을 트리거하지 않지만 콜백 함수 내에서 사용되는 컴포넌트의 현재 상태(값)를 전달하는 데 사용됩니다. Input과 달리 State는 콜백을 활성화하지 않지만, 콜백이 실행될 때 컴포넌트의 최신 상태를 제공합니다.

 

 

@app.callback(
    Output('edit', 'is_open'),
    [Input("edit_open", "n_clicks"), Input("edit_close",
                                                 "n_clicks"), Input("edit_set", "n_clicks")],
    [State('edit', 'is_open'), State('edit_i_id', 'value'), State('edit_b_id', 'value'),
     State('edit_i_group', 'value'), State('edit_question','value'), State('edit_as_type', 'value'),
     State('edit_cl_type', 'value'), State('edit_button_label','value'), State('edit_url', 'value'),
     State('edit_i_desc', 'value'), State('edit_yn', 'value'), State('edit_answer', 'value')]
)
def toggle_modal_edit(n1, n2, n3, is_open, edit_i_id, edit_b_id, edit_i_group, edit_question,
                      edit_as_type, edit_cl_type, edit_button_label, edit_url,
                      edit_i_desc, edit_yn, edit_answer):
    if n1 or n2 or n3:  # 순서대로 '1버튼' '2버튼', '3버튼'
        if n3:  # '3버튼' 버튼 클릭 시
            if not edit_question.strip() or not edit_answer.strip():
                raise PreventUpdate("Question and answer cannot be empty.")
            # 데이터베이스 연결
            engine = create_engine(get_db_info())
            with engine.connect() as connection:
                # 데이터베이스에 추가하는 쿼리 실행
                query = text(f"""
                UPDATE bdb.test_set 
                SET brand_id = '{edit_b_id}', 
                    intent_group = '{edit_i_group}', 
                    question = '{edit_question}', 
                    answer_type = '{edit_as_type}', 
                    call_type = '{edit_cl_type}', 
                    button_label = '{edit_button_label}', 
                    url_call = '{edit_url}', 
                    intent_desc = '{edit_i_desc}', 
                    use_yn = '{edit_yn}', 
                    answer = '{edit_answer}'
                WHERE i_id = '{edit_i_id}'
                """)

                result = connection.execute(query)
                connection.commit()
        return not is_open
    return is_open

 

State('modal_edit', 'is_open'): modal_edit 컴포넌트의 is_open 상태를 나타냅니다. 이것은 모달이 열려있는지 닫혀있는지를 나타내는 불리언 값입니다. 이 상태는 콜백 내에서 모달의 현재 상태를 파악하고 적절하게 토글(열기/닫기)하기 위해 사용됩니다.

 

State('modal-edit_i_id', 'value') 등의 다른 State: 이들은 각각 해당하는 입력 필드(예: i_ID, b_ID, i_그룹 등)의 현재 값을 나타냅니다. 사용자가 이 필드들에 입력한 데이터는 콜백 함수에서 데이터베이스 업데이트 쿼리를 구성하는 데 사용됩니다.

-> edit_i_id, edit_b_id, edit_i_group 등의 값은 데이터베이스 쿼리에서 사용됩니다. 이 값들은 사용자가 입력한 내용을 기반으로 데이터베이스의 특정 레코드를 업데이트하는 데 필요합니다.

 

if not edit_question.strip() or not edit_answer.strip(): edit_questionedit_answer의 값은 사용자가 입력한 질문과 대답을 나타냅니다. 이들은 데이터베이스에 저장되기 전에 공백 여부를 검사하는 데 사용됩니다.

 

이 콜백은 세 개의 Input ("edit_open", "edit_close", "edit_set" 버튼 클릭)을 감지하여 작동합니다. 이 중 어느 것이든 클릭되면 함수가 트리거됩니다. 그런 다음, 함수는 현재 모달의 상태(is_open)와 다른 입력 필드의 값들을 확인하여 로직을 수행합니다. 예를 들어, "edit_set" (수정하기 버튼)이 클릭되면, 입력 필드에서 받은 데이터를 검증하고, 해당 데이터로 데이터베이스를 업데이트합니다.

 

State를 사용하는 주된 이유는 콜백이 트리거될 때 필요한 추가 정보를 제공하기 위함입니다. 여기서는 사용자 입력을 기반으로 데이터베이스 업데이트 로직을 실행하는 데 필요한 정보들이 State로부터 제공됩니다.