Bạn có một script phân tích dữ liệu hay, nhưng sếp không biết chạy Python. Streamlit biến script đó thành web app — không cần HTML, CSS hay JavaScript.
Ứng dụng đầu tiên
pip install streamlit
# app.py
import streamlit as st
import pandas as pd
st.title("Báo cáo doanh thu")
st.write("Chọn tháng để xem chi tiết")
thang = st.selectbox("Tháng", range(1, 13))
st.write(f"Đang xem tháng {thang}")
streamlit run app.py
Trình duyệt mở ở localhost:8501. Sửa file và lưu — trang tự cập nhật.
Mô hình hoạt động
Mỗi lần người dùng chạm vào một widget, Streamlit chạy lại toàn bộ script từ đầu. Hiểu điều này là hiểu Streamlit: không có callback, không có quản lý trạng thái phức tạp — chỉ là script chạy lại với giá trị widget mới.
Các widget thường dùng
ten = st.text_input("Tên của bạn")
tuoi = st.slider("Tuổi", 0, 100, 25)
ngay = st.date_input("Ngày bắt đầu")
dong_y = st.checkbox("Tôi đồng ý")
tep = st.file_uploader("Tải lên CSV", type="csv")
if st.button("Xử lý"):
st.success("Đã xong!")
Bảng và biểu đồ
df = pd.read_csv("doanhthu.csv")
st.dataframe(df) # bảng tương tác, sắp xếp được
st.line_chart(df, x="ngay", y="doanh_thu")
st.bar_chart(df, x="khu_vuc", y="doanh_thu")
st.metric("Tổng doanh thu", "1,2 tỷ", "+8%")
Cache để khỏi tải lại mỗi lần
@st.cache_data(ttl=600)
def tai_du_lieu():
return pd.read_csv("du_lieu_lon.csv")
df = tai_du_lieu() # chỉ đọc file một lần, dùng lại trong 10 phút
Không có dòng này, file sẽ được đọc lại mỗi khi người dùng kéo một thanh trượt.
Bố cục
with st.sidebar:
khu_vuc = st.selectbox("Khu vực", ["Bắc", "Trung", "Nam"])
cot1, cot2 = st.columns(2)
cot1.metric("Đơn hàng", "1.240")
cot2.metric("Khách mới", "312")
with st.expander("Xem dữ liệu thô"):
st.dataframe(df)
Khi nào dùng và khi nào không
Streamlit tuyệt vời cho dashboard nội bộ, công cụ cho nhóm phân tích và bản demo nhanh. Nhưng nó không thay được web framework thật: với sản phẩm nhiều người dùng, cần đăng nhập, phân quyền và tối ưu tốc độ, hãy dùng FastAPI hoặc Django.
