Trong bối cảnh phân tích dữ liệu và mô hình học máy ngày càng phổ biến, việc xây dựng giao diện trực quan, tương tác mà không cần chuyên môn sâu về phát triển web trở thành yêu cầu thiết yếu. Một loạt khung làm việc Python ra đời nhằm giảm thiểu rào cản kỹ thuật, cho phép nhà khoa học dữ liệu và kỹ sư AI triển khai ứng dụng web chỉ trong vài phút — không cần viết HTML, CSS hay JavaScript.
Streamlit: Tối ưu hóa quy trình phát triển ứng dụng phân tích
Streamlit tập trung vào trải nghiệm lập trình tuyến tính: mỗi lần chạy lại script sẽ tự động cập nhật giao diện. Nó phù hợp với các tác vụ như báo cáo động, dashboard giám sát hoặc demo mô hình.
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
st.header("Phân tích xu hướng doanh thu")
# Sinh dữ liệu mẫu
months = ["Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4"]
revenue = np.random.normal(12000, 1800, size=4).astype(int)
# Vẽ biểu đồ bằng Matplotlib
fig, ax = plt.subplots()
ax.bar(months, revenue, color="#4CAF50")
ax.set_ylabel("Doanh thu (VNĐ)")
st.pyplot(fig)
if st.button("Tái tạo dữ liệu"):
st.rerun()
Gradio: Đóng gói mô hình ML thành giao diện người dùng trong một hàm
Gradio đặc biệt mạnh trong việc chuyển đổi hàm Python thành API web có giao diện nhập/xuất đa dạng — từ văn bản, ảnh đến tệp âm thanh — với khả năng chia sẻ tức thì qua liên kết.
import gradio as gr
from PIL import Image
import torch
def classify_image(pil_img):
# Giả sử đây là mô hình phân loại đã huấn luyện
return {"Mèo": 0.87, "Chó": 0.12, "Gà": 0.01}
demo = gr.Interface(
fn=classify_image,
inputs=gr.Image(type="pil"),
outputs=gr.Label(num_top_classes=3),
title="Bộ phân loại hình ảnh",
description="Tải lên ảnh để nhận diện đối tượng"
)
demo.launch(server_port=7860)
Dash: Kiến trúc dựa trên callback cho dashboard tương tác phức tạp
Dash cung cấp mô hình lập trình phản ứng rõ ràng, nơi mỗi thay đổi ở đầu vào (dropdown, slider…) kích hoạt callback để cập nhật đầu ra (biểu đồ, bảng dữ liệu…), rất phù hợp cho hệ thống giám sát thời gian thực.
import dash
from dash import dcc, html, Input, Output, State
import plotly.graph_objects as go
app = dash.Dash(__name__)
app.layout = html.Div([
html.H2("Dashboard Doanh Thu Theo Khu Vực"),
dcc.Dropdown(
id="region-selector",
options=["Hà Nội", "TP.HCM", "Đà Nẵng"],
value="Hà Nội"
),
dcc.Graph(id="revenue-chart")
])
@app.callback(
Output("revenue-chart", "figure"),
Input("region-selector", "value")
)
def update_chart(selected_region):
# Dữ liệu giả lập theo khu vực
x_data = ["Q1", "Q2", "Q3", "Q4"]
y_data = {"Hà Nội": [24, 28, 32, 35], "TP.HCM": [29, 31, 27, 33], "Đà Nẵng": [18, 22, 25, 29]}
fig = go.Figure(data=go.Scatter(x=x_data, y=y_data[selected_region], mode="lines+markers"))
fig.update_layout(title=f"Doanh thu quý tại {selected_region}", xaxis_title="Quý", yaxis_title="Triệu VNĐ")
return fig
if __name__ == "__main__":
app.run_server(debug=True)
NiceGUI: Giao diện hiện đại với kiến trúc đồng bộ, hỗ trợ desktop & web
NiceGUI tận dụng Qt dưới nền để cung cấp UI mượt mà, hỗ trợ layout responsive và cập nhật trạng thái tức thì — lý tưởng cho ứng dụng điều khiển thiết bị hoặc dashboard nhúng.
from nicegui import ui
import asyncio
async def update_counter():
count = 0
while True:
ui.label(f"Lần cập nhật: {count}").classes("text-lg font-mono")
count += 1
await asyncio.sleep(2)
ui.button("Bắt đầu đếm", on_click=update_counter)
ui.run(title="NiceGUI Demo", port=8081)
PyWebIO: Phát triển web theo phong cách dòng lệnh
PyWebIO mô phỏng luồng tương tác CLI trên trình duyệt: người dùng nhập → chương trình xử lý → in kết quả. Đây là lựa chọn tối ưu cho công cụ nội bộ, form thu thập dữ liệu hoặc bot tương tác đơn giản.
from pywebio.input import select, input as pw_input
from pywebio.output import put_markdown, put_table, toast
from pywebio import start_server
def survey_form():
put_markdown("# Khảo sát mức độ hài lòng")
name = pw_input("Họ và tên")
rating = select("Đánh giá chất lượng dịch vụ", options=[1, 2, 3, 4, 5])
feedback = pw_input("Góp ý thêm (tùy chọn)")
put_table([
["Tên", "Điểm", "Góp ý"],
[name, f"{rating}/5", feedback or "-"]
])
toast("Cảm ơn bạn đã tham gia khảo sát!", color="success")
start_server(survey_form, port=8082)
WebSim: Mô phỏng tương tác thời gian thực với dữ liệu chuỗi
WebSim được thiết kế riêng cho các bài toán mô phỏng động — ví dụ như mô hình hóa quy trình sản xuất, mô phỏng lưu lượng mạng hoặc hiển thị dữ liệu cảm biến IoT theo thời gian thực.
from websim import SimulationApp, LineChart, SliderControl
app = SimulationApp(title="Mô phỏng nhiệt độ phòng")
# Thiết lập biểu đồ thời gian thực
temp_chart = LineChart("Nhiệt độ theo thời gian", x_label="Giây", y_label="°C")
app.add_component(temp_chart)
# Thêm điều khiển thủ công
slider = SliderControl("Tốc độ mô phỏng", min_val=0.1, max_val=5.0, step=0.1, default=1.0)
app.add_control(slider)
# Hàm mô phỏng
def simulate_temperature():
import time
base_temp = 25.0
while app.is_running():
noise = (time.time() * 0.3) % 2 - 1 # dao động nhẹ
current = base_temp + noise * 0.8
temp_chart.append(time.time(), current)
time.sleep(0.5 / slider.value)
app.run_background(simulate_temperature)
app.start()