
st.session_state는 사용자의 세션(앱이 실행되는 동안 유지되는 상태)을 저장하고 관리할 수 있는 키-값 저장소
📌 즉, 페이지를 새로고침하거나 앱을 재시작해도 유지되는 상태 관리 도구다.
일반적인 변수와 다르게 Streamlit의 리렌더링을 방지하면서 데이터를 유지할 수 있다!
Streamlit에서는 딕셔너리(dict)처럼 st.session_state["key"] 형식으로 값을 저장하고 가져올 수 있다.
import streamlit as st
if "counter" not in st.session_state:
st.session_state["counter"] = 0
if st.button("🔼 증가"):
st.session_state["counter"] += 1
st.write(st.session_state['counter'])
사용자가 버튼을 클릭하면 counter가 오른다.
Streamlit의 경우, 기본적으로 Python이 실행되는 것처럼 위에서 아래로 실행이 된다.
import streamlit as st
counter = 0
if st.button("🔼 증가"):
counter += 1
st.write(counter)
counter를 0으로 하고 버튼을 누르면 counter 값이 오르도록 설정했지만, 버튼을 누를 때마다 코드가 다시 위에서부터 실행되면서 counter 값이 0으로 초기화된다.counter 값은 0 또는 1만 나오게 된다.st.session_state를 사용하면 버튼을 눌러도 값이 유지되면서 정상적으로 증가하게 된다.즉, 사용자에 따라 인터렉트에따라 값이 유지되어야 한다면 session_state를 사용해야 한다.
value = st.session_state[key]
or
value = st.session_state.get(key)
st.session_state[key] = value
st.session_state.__delattr__(key)
or
del st.session_state["counter"]
st.session_state.clear()
간단하게 사용할 수 있는 예시를 보자.
import streamlit as st
# session_state애 logged_in key값이 없으면 False라고 설정
if "logged_in" not in st.session_state:
st.session_state["logged_in"] = False
# 로그인 버튼을 누르면 logged_in값 True
if st.button("로그인"):
st.session_state["logged_in"] = True
# logged_in값이 True면 로그인 완료! 표시
if st.session_state["logged_in"]:
st.success("로그인 완료!")
st.session_state 값 초기화 방법
if "logged_in" not in st.session_state: st.session_state["logged_in"] = False해당 부분을 사용하는 이유는
st.session_state["logged_in"] = False로 설정하면
리렌더링될 때마다 logged_in 값이 다시 False로 초기화되기 때문이다.
그래서 최초 렌더링 시if "logged_in" not in st.session_state:를 사용해
값이 설정되지 않았다면 초기값을 할당하는 방식으로 해결하는 것이다!setdefault()를 활용한 코드 단축
위 코드를 한 줄로 줄일 수 있는 방법이 있다.
바로 st.session_state.setdefault(key, default)를 사용하는 것이다.st.session_state.setdefault("logged_in", False)
- ✅ 위와 같이 작성하면 st.session_state["logged_in"]가 없을 때만 False로 설정된다.
- ✅ 기능은 동일하지만 코드가 더 깔끔해진다!
즉, 페이지를 다시 로드해도 데이터가 사라지지 않게 하고 싶다! → session_state 사용!
물론 완벽한 해결책은 아니다.
st.session_state는 사용자가 새로고침(F5) 을 하면 값이 초기화된다.
즉, session_state를 쿠키나 영구 저장소처럼 사용하려고 하면 문제가 발생할 수 있다.