[streamlit] pages/ 디렉토리를 사용하여 멀티 페이지 앱(multi page apps) 만들기

[출처] https://docs.streamlit.io/develop/concepts/multipage-apps/pages-directory

 

Streamlit Docs

Join the community Streamlit is more than just a way to make data apps, it's also a community of creators that share their apps and ideas and help each other make their work better. Please come join us on the community forum. We love to hear your questions

docs.streamlit.io


다중 페이지 앱을 선언하는 가장 사용자 정의 가능한 방법은 페이지 및 탐색을 사용하는 것입니다. 하지만 스트림릿은 페이지가 자동으로 인식되어 앱 사이드바의 탐색 위젯에 표시되는 멀티페이지 앱을 간편하게 만들 수 있는 방법도 제공합니다. 이 방법은 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

이제 다중 페이지 앱에 대해 확실히 이해했습니다. 앱을 구성하고, 페이지를 정의하고, 사용자 인터페이스에서 페이지 간을 탐색하는 방법을 배웠습니다. 이제 첫 번째 멀티페이지 앱을 만들 차례입니다! 🥳