본문 바로가기
뭐든지 해보자- 프로젝트

오블완 1일차)유용하게 쓴 streamlit 기능들

by 채소장사 2024. 11. 7.

최근에 ChatGPT api를 이용한 간단한 프로젝트를 streamlit을 통해 구현하면서, 유용하게 사용한 몇가지 기능들을 정리해보았다.

1. Streamlit share를 private하게 사용하기


파이썬 웹앱을 구현할 때, 마주치는 흔한 고민 중 하나는 "어디에다 배포할 것인가?"이다. 상대적으로 파이썬 백엔드를 웹서버로 제공하는 호스팅 서비스가 드물뿐더러, 일반적인 웹서버와 파이썬 코드를 연동하는 방식에 대한 설명을 찾기 쉽지않았다. 물론 클라우드에서 가상 서버를 활용하는 방식이나 파이썬 백엔드 프레임워크들에 대한 학습이 (상대적으로)
어렵지는 않겠지만, 간단한 웹구현을 목표로하는 streamlit 사용자 입장에서는 한없이 어렵게 느껴졌다.
다행히도 streamlit에서는 무료로 배포가 가능한 클라우드 서비스인 Streamlit Community Cloud(https://share.streamlit.io/)를 제공하고 있다.
깃허브에 올려놓은 streamlit 코드로부터 손쉽게 배포를 할 수 있는데, 로컬에서 확인한 구현사항을 다른사람과 쉽게 공유할 수 있다는 점에서 여러 프로젝트에서 유용하였다.
비록 배포된 앱과 연동된 저장소는 업로드 후 부팅이 끝나면 비공개(private)로 돌릴 수 있어, 코드 공개에 대한 부담을 줄일 수 있었지만, 소수의 사용자에게만 구현을 공개하는 방식이 조금 까다로웠다.
물론 일부공개가 가능한 대부분의 서비스와 마찬가지로 공개하려는 사람들만 초대할 수 있었는데, 문제는 내가 진행한 프로젝트처럼 사용자들이 깃허브 로그인과 같은 개발 서비스에 익숙하지 않은 경우였다. (사실 이쯤되면 문제정의와 활용할 인프라를 꼼꼼히 설계하지 못했다는 생각도 들지만, 어쨌든 가난한 개발자에게는 한번씩 마주치는 지점이라고 생각이 들었다.)
이런 문제점의 해결책으로 가장 간단하게 로그인 시스템을 구현해서 streamlit앱의 사용전 인증에 활용하는 방식을 사용했다. 이를 통해 간단한 게스트용 아이디-비밀번호를 활용해 클라우드에 배포된 공개앱을 인증정보를 공유한 소수 사용자가 사용할 수 있게 하였다.

인증을 위해 사용한 패키지는 streamlit-authenticator(https://github.com/mkhorasani/Streamlit-Authenticator)이다. 흔히 streamlit의 인증을 위한 패키지로 많이 쓰이며, streamlit 공식블로그에서도 이 패키지를 사용하는 방식에 관한 포스트(https://blog.streamlit.io/streamlit-authenticator-part-1-adding-an-authentication-component-to-your-app/)를 올려두었다.
문제는 이 패키지가 아이디-비밀번호와 같은 인증정보를 yaml파일로 저장하여 활용한다는 사실이다.
다들 이해하다시피 이런 비밀정보를 깃허브에 올리는 것은 피해야하며, 비밀파일이 업로드될 경우 인증정보가 노출된 것과 다름없게 된다. 다행히 streamlit에서는 st.secrets로 접근할 수 있는 숨김경로를 사용할 수 있다.
프로젝트 최상단에서 .streamlit/ 이라는 숨김폴더를 만들고 그 안에 secrets.toml 안에 정보를 기입하면 st.secrets로써 해당정보를 사용할 수 있다. 다음 포스트를 참고한다(https://docs.streamlit.io/develop/api-reference/connections/st.secrets)
당연히 이러한 비밀정보는 .gitignore 등으로 업로드를 방지하였기때문에 streamlit 클라우드에 깃허브 저장소를 통해 업로드-배포를 하였을 때에는 문제를 겪게된다. 다행히 streamlit community cloud 서비스는 배포 후 설정>secrets 에 st.secrets가 참조할 수 있는 내용들을 입력할 수 있게 해준다(https://docs.streamlit.io/deploy/streamlit-community-cloud/deploy-your-app/secrets-management)
그래서 여기에 인증정보를 똑같이 입력함으로써 손쉽게 인증을 거친 후 웹앱 서비스를 사용할 수 있도록 구현할 수 있었다.
어쩌면 이또한 복잡한 과정일 수 있겠지만, 간단하게 서비스 형태를 관련자들에게 공유하고, 다른 프로그래밍언어로 피봇팅하기 전에 대략의 아이디어를 설명하는 방법으로 유용하게 쓰고 있다.
좀 더 자세한 코드와 함께 사용방법을 여기에다가 계속 덧붙이려고한다.

댓글