Streamlit - Triển khai ứng dụng python đơn giản mà hiệu quả


Lý do

- Tôi mới học python, biết được mấy dòng if else với while rồi, nhưng tự hỏi đến bao giờ mới xây dựng được một cái gì đó hay hay, một tháng hay nửa năm nữa ?
- Tôi là dev cứng, làm desktop app hay web app không thành vấn đề, nhưng chỉ cần làm 1 tool nhỏ để tương tác web service, hoặc chạy đoạn code python đơn giản thôi. chả lẽ phải bỏ vài ngày làm app thật sao ?
- Tôi đang có một ý tưởng về 1 dự án Data Science hoặc Machine Learning, tôi thích chơi với các thuật toán hơn là làm một cái web, nhưng cần phải làm web demo cho pro, chứ ai lại demo bằng terminal ?
- ...

Giải pháp

Streamlit là một app framework ban đầu được thiết kế ra xây dựng nhanh các ứng dụng cho Machine Learning và Data Science team, tuy nhiên vì nó quá hay nên nhiều người đã dùng nó cho nhiều mục đích khác nhau.
Xem thêm ở đây để biết có rất nhiều ứng dụng dùng streamlit:
Ở link trên có các demo về xe tự lái, dự đoán sắc thái bình luận, nhận dạng ảnh....Rất nhiều ứng dụng, đặc điểm chung các ứng dụng trên là code rất đơn giản, tập trung vào nghiệp vụ trọng tâm mà không cần phải lo về giao diện web và các control.

Thử chút

Tất nhiên để dùng được nó thì phải cài đặt nó trong bash(linux) hoặc cmd(window):

pip install streamlit
Xong có thể chạy demo bằng lệnh:

streamlit hello
Và vào trình duyệt
Mặc dù giao diện là khá khô khan và đơn xơ nhưng streamlit đủ dùng cho một số yêu cầu nhất định. Nó có thể tạo nhanh các ứng dụng đơn giản với dữ liệu dạng bảng, hiển thị biểu đồ, tương tác với các button và nhập liệu, dùng cache lưu trữ tạm thời, upload file... và tất nhiên là làm các điều trên với chi phí công sức thấp nhất có thể.
Ví dụ:
Chỉ với vài dòng code sau:

import streamlit as st

name = st.text_input(
"Input your name:")
age = st.number_input(
"Input your age:")
gender = st.selectbox(
"Male/Female", ['Male', 'Female'])
have_money=st.checkbox(
"Do you have money?")if st.button("Done"):
  st.write({
     
'name':name,
     
'age': age,
     
'gender': gender,
     
'have_money': have_money
  })
Đã có một giao diện web như sau:
Tất nhiên ưu điểm là nhanh chóng gọn nhẹ, nhưng yếu điểm thì cũng nhiều
- Nó không phù hợp với những ứng dụng phức tạp về nghiệp vụ và giao diện
- Các tính năng đang trong quá trình phát triển, còn thiếu và lỗi, như tính năng upload nhiều file chưa có…
- Hiện tại thì việc tùy chỉnh giao diện là khó và rất khó với người chưa quen, chưa có tính năng download file trực tiếp mà phải dùng một số cách khác.
Nhưng công bằng mà nói nó hiện tại là một công cụ rất tuyệt vời, đáng để thử và rất có thể nó sẽ có ích với bạn theo một cách nào đó. Ví dụ tôi đã dùng nó để tạo công cụ quản lý chatbot cho đội tư vấn (các bạn nữ xinh gái nhưng không rành về máy tính lắm) dùng hàng ngày, tạo ra một công cụ demo ứng dụng nhận dạng khuôn mặt, để hiển thị các số liệu phân tích dữ liệu của một ứng dụng khác…

Một số câu hỏi về streamlit

- Có thể custom được giao diện không: Có, mà thôi coi như là không đi. Vì phải hiểu sâu về streamlit, tuy nhiên việc tự sửa code trong thư viện luôn luôn không được khuyến cáo. Trong road map của streamlit thì có thể custom được giao diện. Tuy nhiên chưa biết bao giờ hoàn thành.
- Có thể upload file được không: Có, từ phiên bản 0.53 thì đã có tính năng upload file rồi, tuy nhiên hiện chưa hỗ trợ upload nhiều file 1 lúc, nếu cần thiết thì có thể upload dạng file nén rồi giải nén
- Có thể download file được không: Có, tuy nhiên chưa được hỗ trợ chính thức, hiện vẫn phải workaround bằng cách dùng storage khác (google storage, minio storage rồi trả về link), Hoặc có cách khác là để đường dẫn file download trong thư mục static của tornado(framework mà streamlit sử dụng) và trả về đường dẫn file, bằng cách này thì dữ liệu vẫn lưu tại server.
- Có thể tạo nhiều page streamlit được không: Có, khá đơn giản, bằng cách tạo 1 select box để chọn chức năng, và sau đó tùy chức năng nào được chọn thì mình sẽ render ra giao diện tương ứng. Tất nhiên nếu có thể thì áp dụng OOP để cấu trúc mỗi page là một class. Như thế code sẽ rõ ràng và rảnh mạch hơn nhiều.
thank you and enjoy!