웹 개발 입문
값을 기억하게 하기목록을 쌓기 · 방명록 만들기한 번에 제출하기위젯 콜백연습하기 Level 2
놀면 뭐 하니,
그냥 하는거야.

목록을 쌓기 · 방명록 만들기

코딩냥

지난 시간엔 숫자 하나를 기억했지? 오늘은 여러 개를 차곡차곡 기억하게 해본다냥. 서랍 안에 숫자 대신 리스트를 넣는 거다냥. 이걸로 방명록을 만들면, 사람들이 남긴 글이 아래로 계속 쌓인다냥!

오늘의 학습 목표

  • session_state 에 리스트를 저장한다.
  • 새 글을 리스트에 append 로 추가한다.
  • 쌓인 글을 for 로 훑어서 화면에 보여준다.
실습 준비·필요한 패키지와 버전
  • streamlit1.40 이상파이썬 코드로 웹 화면 만들기

설치하기 — 터미널에 그대로 붙여넣기

pip install "streamlit>=1.40"

설치 확인 — 버전 번호가 찍히면 성공

python -c "import streamlit; print(streamlit.__version__)"

위 버전은 최소 기준이라, 더 높은 버전이 깔려 있으면 그대로 써도 된다냥. 버전이 안 찍히고 에러가 나면 설치가 안 된 거라 설치 명령을 다시 실행해보자냥.

1단계 · 서랍에 리스트를 넣는다냥

코딩냥

카운터에선 서랍에 숫자(0)를 넣었지? 방명록에선 서랍에 빈 리스트 ([]) 를 넣는다냥. 그리고 글이 들어올 때마다 그 리스트에 하나씩 추가하는 거다냥.

import streamlit as st

# 처음 한 번만 빈 리스트로 초기화
if "guestbook" not in st.session_state:
    st.session_state["guestbook"] = []

카운터와 판박이라냥

구조가 12강 카운터랑 똑같다냥. 다른 건 서랍에 넣는 게 0(숫자)이 아니라 [](빈 리스트)라는 것뿐이다냥!

2단계 · append 로 쌓기

코딩냥

리스트에 새 항목을 넣는 함수, 파이썬 탐험하기에서 배웠지? 그렇다냥, append 다냥. 입력받은 글을 서랍 속 리스트에 append 하면 된다냥.

message = st.text_input("방명록에 남길 말")

if st.button("남기기"):
    st.session_state["guestbook"].append(message)

글이 안 사라지는 이유

리스트가 session_state 서랍 안에 있으니, 재실행이 일어나도 그동안 쌓은 글이 그대로 남아 있다냥. 그래서 append 할 때마다 리스트가 점점 길어진다냥!

3단계 · for 로 펼쳐 보여주기

코딩냥

이제 쌓인 글들을 화면에 보여줄 차례다냥. 리스트를 for 로 하나씩 훑으면서 화면에 뿌리면 된다냥.

st.subheader("남겨진 방명록")

for msg in st.session_state["guestbook"]:
    st.write("- " + msg)
미션 1·방명록 완성하기12분

위 조각들을 하나로 합치면 방명록이 완성된다냥. 전체 코드는 이렇다냥.

import streamlit as st

st.title("코딩냥이 방명록이다냥")

if "guestbook" not in st.session_state:
    st.session_state["guestbook"] = []

message = st.text_input("방명록에 남길 말")

if st.button("남기기"):
    st.session_state["guestbook"].append(message)

st.subheader("남겨진 방명록")
for msg in st.session_state["guestbook"]:
    st.write("- " + msg)

직접 해보면

글을 쓰고 "남기기" 를 누르면 아래 목록에 하나씩 추가된다냥. 여러 번 누르면 계속 쌓인다냥. 12강의 카운터가 "숫자 쌓기" 였다면, 이건 "글 쌓기" 라냥!

미션 2·빈 글 막기 (도전)6분

지금은 아무것도 안 쓰고 "남기기" 를 눌러도 빈 줄이 추가된다냥. 이걸 막아보자냥.

if st.button("남기기"):
    if message:                 # 빈 문자열이 아닐 때만
        st.session_state["guestbook"].append(message)
    else:
        st.warning("한 글자라도 써야 남길 수 있다냥!")

if message: 는 "message 가 빈 문자열이 아니면" 이라는 뜻이라냥. 6강에서 빈 입력이 "" 라고 배운 게 여기서 쓰인다냥!

복습 퀴즈

Q1.방명록처럼 여러 개를 기억하려면 session_state 에 무엇을 넣냥?
Q2.새 글을 리스트에 추가하는 함수는?
Q3.쌓인 글을 전부 화면에 보여줄 때 쓰는 반복문은?
코딩냥

방명록을 만들었다냥! 그런데 입력이 여러 개(이름 + 내용 + 별점)면 매번 글자 칠 때마다 재실행돼서 좀 정신없다냥. 다음 시간엔 여러 입력을 한 번에 제출하는 st.form 을 배워보자냥.

14 / 33
이전3부 · 기억하는 앱 · 값을 기억하게 하기다음3부 · 기억하는 앱 · 한 번에 제출하기