[streamlit] pages/ 디렉토리를 사용하여 멀티 페이지 앱(multi page apps) 만들기
[출처] https://docs.streamlit.io/develop/concepts/multipage-apps/pages-directory
다중 페이지 앱을 선언하는 가장 사용자 정의 가능한 방법은 페이지 및 탐색을 사용하는 것입니다. 하지만 스트림릿은 페이지가 자동으로 인식되어 앱 사이드바의 탐색 위젯에 표시되는 멀티페이지 앱을 간편하게 만들 수 있는 방법도 제공합니다. 이 방법은 pages/ 디렉토리를 사용합니다.
이 페이지에서는 개요에 제시된 페이지 용어를 이해했다고 가정합니다.
1. App structure
pages/ 디렉토리를 사용하면 스트림릿은 디렉토리 구조와 파일명을 기준으로 멀티페이지 앱의 페이지를 식별합니다. 엔트리포인트 파일(streamlit run 을 위해 전달한 파일)은 앱의 홈페이지입니다. 엔트리포인트 파일 옆에 pages/ 디렉토리가 있으면 Streamlit은 그 안에 있는 각 파이썬 파일을 페이지로 식별합니다. 다음 예시에는 세 개의 페이지가 있습니다. your_homepage.py는 엔트리포인트 파일이자 홈페이지입니다.
your_working_directory/
├── pages/
│ ├── a_page.py
│ └── another_page.py
└── your_homepage.py
단일 페이지 앱과 마찬가지로 다중 페이지 앱을 실행합니다. 엔트리포인트 파일을 스트림라이트 실행에 전달합니다.
streamlit run your_homepage.py
pages/ 디렉토리에 있는 .py 파일만 페이지로 식별됩니다. Streamlit은 pages/ 디렉터리와 그 하위 디렉터리에 있는 다른 모든 파일은 무시합니다. Streamlit은 pages/의 하위 디렉터리에 있는 Python 파일도 무시합니다.
<중요>
앱에서 st.navigation을 호출하면(모든 세션에서) Streamlit은 최신 페이지 및 탐색 다중 페이지 구조를 사용하도록 전환합니다. 이 경우 pages/ 디렉토리는 모든 세션에서 무시됩니다. 앱을 다시 시작하지 않는 한 pages/ 디렉토리로 되돌릴 수 없습니다.
2. How pages are sorted in the sidebar
스트림릿이 파일 이름을 구성하는 number, separator, identifier 및 ".py" 확장자를 기반으로 자동 페이지 레이블과 URL을 할당하는 방법을 이해하려면 개요를 참조하세요.
엔트리포인트 파일은 항상 가장 먼저 표시됩니다. 나머지 페이지는 다음과 같이 정렬됩니다:
- 숫자가 있는 파일은 숫자가 없는 파일 앞에 표시됩니다.
- 파일은 숫자(있는 경우)와 레이블(있는 경우)을 기준으로 정렬됩니다.
- 파일이 정렬될 때 Streamlit은 숫자를 문자열이 아닌 실제 숫자로 취급합니다. 따라서 03은 3과 동일합니다.
이 표에는 파일 이름과 해당 레이블의 예가 사이드바에 표시되는 순서에 따라 정렬되어 있습니다.
Tip
이모지를 사용하여 페이지 이름을 더 재미있게 만들 수 있습니다! 예를 들어, 🏠_Home.py라는 파일은 사이드바에 "🏠 Home"이라는 제목의 페이지를 만듭니다. 파일 이름에 이모지를 추가할 때는 터미널에서 자동 완성을 더 쉽게 할 수 있도록 번호가 매겨진 접두사를 포함하는 것이 좋습니다. 터미널 자동 완성 기능은 유니코드(이모지가 표시되는 방식)로 인해 혼동될 수 있습니다.
3. Notes and limitations
- 페이지는 run-on-save(파일이 저장될 때 자동으로 특정 작업이나 스크립트를 실행하는 기능)를 지원합니다.
- 앱이 실행 중인 상태에서 페이지를 업데이트하면 현재 해당 페이지를 보고 있는 사용자에게 페이지가 다시 실행됩니다.
- 앱이 실행 중인 상태에서 페이지를 업데이트하면 현재 다른 페이지를 보고 있는 사용자를 위해 앱이 자동으로 다시 실행되지 않습니다.
- 앱이 실행 중일 때 페이지를 추가하거나 삭제하면 사이드바 탐색이 즉시 업데이트됩니다.
- st.set_page_config는 페이지 수준에서 작동합니다.
- st.set_page_config를 사용하여 제목 또는 파비콘을 설정하는 경우 현재 페이지에만 적용됩니다.
- st.set_page_config를 사용하여 레이아웃을 설정하면 st.set_page_config를 다시 호출하여 변경할 때까지 해당 세션에 대한 설정이 유지됩니다. st.set_page_config를 사용하여 레이아웃을 설정하는 경우 모든 페이지에서 이 함수를 호출하는 것이 좋습니다.
- 페이지는 전역적으로 동일한 Python 모듈을 공유합니다:
# page1.py
import foo
foo.hello = 123
# page2.py
import foo
st.write(foo.hello) # If page1 already executed, this writes 123
- 페이지는 동일한 st.session_state를 공유합니다:
# page1.py
import streamlit as st
if "shared" not in st.session_state:
st.session_state["shared"] = True
# page2.py
import streamlit as st
st.write(st.session_state["shared"]) # If page1 already executed, this writes True
이제 다중 페이지 앱에 대해 확실히 이해했습니다. 앱을 구성하고, 페이지를 정의하고, 사용자 인터페이스에서 페이지 간을 탐색하는 방법을 배웠습니다. 이제 첫 번째 멀티페이지 앱을 만들 차례입니다! 🥳