Gradio에서는 전역(global) 상태와 세션(session) 상태 중에서 상태 유지를 할 수 있다.
블록의 전역 상태(global state)는 인터페이스와 유사한 기능을 제공한다.
함수 외부에서 정의된 변수나 데이터는 모든 함수에서 접근할 수 있다.
아래의 track_gdp
예시에서는 변수 gdps
가 모든 사용자에게 공유된다.
앱에 접근하는 사용자들은 자신의 점수를 리스트에 추가할 수 있다.
import gradio as gr
gdps = []
def track_gdp(gdp):
gdps.append(gdp)
top_gdps = sorted(gdps, reverse=True)[:3]
return top_gdps
demo = gr.Interface(
track_gdp,
gr.Number(label="gdp"),
gr.JSON(label="Top gdps")
)
demo.launch()
Gradio는 세션 상태(session state)를 지원하여 페이지 세션 내에서 여러 번의 제출(submit)을 통해 데이터를 유지할 수 있다.
세션 상태를 사용하기 위해 다음 단계를 따른다:
gradio.State()
객체를 정의한다.State
객체를 입력과 출력으로 배치한다.세션 상태(session state)를 설명하기 위해 행맨 게임을 예시로 들겠다.
import gradio as gr
import random
secret_word = "Machine"
with gr.Blocks() as demo:
used_letters_var = gr.State([])
with gr.Row() as row:
with gr.Column():
input_letter = gr.Textbox(label="Enter letter")
btn = gr.Button("Guess Letter")
with gr.Column():
hangman = gr.Textbox(
label="Hangman",
value="_"*len(secret_word)
)
used_letters_box = gr.Textbox(label="Used Letters")
def guess_letter(letter, used_letters):
used_letters.append(letter)
answer = "".join([
(letter if letter in used_letters else "_")
for letter in secret_word
])
return {
used_letters_var: used_letters,
used_letters_box: ", ".join(used_letters),
hangman: answer
}
btn.click(
guess_letter,
[input_letter, used_letters_var],
[used_letters_var, used_letters_box, hangman]
)
demo.launch()
페이지 내에서 세션이 유지되는 것을 확인할 수 있다.
그러나 앱을 새 탭에서 로드하거나 애플리케이션을 새로고침하면 "추측" 기록은 공유되지 않음을 알 수 있다.