Bạn đã học Python cơ bản, viết được vài script tự động hóa, và giờ muốn biến chúng thành một trang web để người khác dùng được qua trình duyệt. Con đường ngắn nhất thường là Flask, một framework web nhỏ gọn đến mức trang web đầu tiên chỉ cần khoảng 10 dòng code.
Bài viết giải thích Flask là gì, khi nào nên chọn Flask thay vì Django hay FastAPI, rồi hướng dẫn từng bước từ cài đặt, viết route, dùng template Jinja2, xử lý form cho đến đưa ứng dụng lên server.
Câu trả lời ngắn: Flask là một micro-framework mã nguồn mở để viết ứng dụng web bằng Python. Phiên bản mới nhất là Flask 3.1.3 (phát hành tháng 2/2026), yêu cầu Python 3.9 trở lên. Cài bằng pip install flask, viết file app.py, chạy flask --app app run --debug rồi mở http://127.0.0.1:5000.

Tóm tắt nhanh
- Flask nhỏ gọn, dễ học, chỉ có phần lõi (định tuyến, template, request), phần còn lại bạn tự chọn thư viện.
- Luôn tạo môi trường ảo (venv) riêng cho từng dự án trước khi cài Flask.
- Năm khái niệm cốt lõi: route, template, Jinja2, request, url_for/redirect.
- Muốn có trang quản trị, ORM, đăng nhập sẵn thì Django tiện hơn; chỉ viết API hiệu năng cao thì xem FastAPI.
- Không dùng
flask runvà chế độ debug trên server thật; hãy chạy bằng Gunicorn hoặc Waitress.
Mục lục
- Flask là gì
- Flask, Django hay FastAPI
- Cài đặt Flask
- Viết ứng dụng Flask đầu tiên
- Route và URL động
- Template Jinja2 và file tĩnh
- Xử lý form
- Đưa ứng dụng lên server
- Học gì tiếp theo
- Câu hỏi thường gặp
- Kết luận
Flask là gì
Flask do Armin Ronacher viết năm 2010, nay được nhóm mã nguồn mở Pallets phát triển cùng các thư viện anh em như Werkzeug (xử lý HTTP), Jinja2 (template) và Click (dòng lệnh). Flask được gọi là micro-framework không phải vì chỉ làm được web nhỏ, mà vì phần lõi được giữ tối giản: nó lo việc nhận yêu cầu từ trình duyệt, chuyển tới đúng hàm Python và trả kết quả về. Cơ sở dữ liệu, đăng nhập, gửi email… bạn tự chọn tiện ích mở rộng phù hợp.
Nhờ vậy Flask rất hợp để học cách một ứng dụng web vận hành, viết nhanh bản thử nghiệm (prototype), làm API nhỏ, bảng điều khiển nội bộ hay giao diện web cho mô hình AI. Pinterest, LinkedIn từng dùng Flask cho một số dịch vụ, và Flask vẫn nằm trong nhóm framework web Python được dùng nhiều nhất.

Flask, Django hay FastAPI

- Chọn Flask khi bạn mới học web, cần làm nhanh một ứng dụng nhỏ hoặc muốn tự quyết từng thành phần.
- Chọn Django khi làm website lớn có nhiều bảng dữ liệu, cần trang quản trị và hệ thống tài khoản dựng sẵn.
- Chọn FastAPI khi chủ yếu viết API JSON cho ứng dụng di động, frontend React/Vue hay dịch vụ AI, cần hiệu năng cao và tài liệu API tự sinh.
Kiến thức học được từ Flask (route, request, template) dùng lại được gần như nguyên vẹn khi chuyển sang hai framework còn lại.
Cài đặt Flask
Trước tiên, kiểm tra máy đã có Python 3.9 trở lên bằng lệnh python --version (trên macOS, Linux dùng python3). Người dùng Windows có thể cài Python từ python.org hoặc từ Microsoft Store.
- Tạo thư mục dự án và di chuyển vào đó:
mkdir hello-flask cd hello-flask - Tạo môi trường ảo để thư viện của dự án không lẫn với hệ thống:
python -m venv .venv - Kích hoạt môi trường ảo:
# Windows (PowerShell) .venv\Scripts\Activate.ps1 # macOS, Linux source .venv/bin/activate - Cài Flask:
pip install flask
Nếu gặp lỗi kiểu “No module named flask”, gần như chắc chắn bạn đang chạy Python ngoài môi trường ảo. Cách xử lý tương tự lỗi No module named openai: kích hoạt lại venv rồi cài lại thư viện.
Viết ứng dụng Flask đầu tiên
Tạo file app.py với nội dung:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def trang_chu():
return "<h1>Xin chào từ Flask!</h1>"
Chạy ứng dụng ở chế độ debug:
flask --app app run --debug
Mở trình duyệt vào http://127.0.0.1:5000, bạn sẽ thấy dòng chữ “Xin chào từ Flask!”. Ở chế độ debug, mỗi khi bạn lưu file, Flask tự khởi động lại, và khi có lỗi, trình duyệt hiển thị chi tiết dòng code gây lỗi. Nhấn Ctrl + C trong cửa sổ dòng lệnh để dừng.
Trên macOS, nếu cổng 5000 bị tính năng AirPlay Receiver chiếm, hãy đổi cổng: flask --app app run --debug --port 8000.
Route và URL động

Mỗi route gắn một địa chỉ URL với một hàm Python. Bạn có thể lấy một phần của URL làm tham số:
@app.route("/xin-chao/<ten>")
def xin_chao(ten):
return f"Xin chào {ten}!"
@app.route("/san-pham/<int:ma>")
def san_pham(ma):
return f"Đây là sản phẩm số {ma}"
Truy cập /xin-chao/Phuc sẽ hiện “Xin chào Phuc!”. Phần <int:ma> bắt buộc tham số phải là số nguyên, nếu không Flask trả lỗi 404.
Template Jinja2 và file tĩnh
Viết HTML trong chuỗi Python nhanh chóng trở nên rối. Flask dùng Jinja2 để tách giao diện ra file riêng trong thư mục templates.

Tạo file templates/index.html:
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8">
<title>{{ tieu_de }}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>{{ tieu_de }}</h1>
<ul>
{% for viec in danh_sach %}
<li>{{ viec }}</li>
{% endfor %}
</ul>
</body>
</html>
Sửa hàm trang chủ trong app.py:
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def trang_chu():
viec_can_lam = ["Học Python", "Học Flask", "Làm website đầu tiên"]
return render_template("index.html", tieu_de="Việc cần làm", danh_sach=viec_can_lam)
Cú pháp {{ ... }} chèn giá trị, {% ... %} dùng cho vòng lặp và điều kiện. Jinja2 tự escape ký tự HTML trong dữ liệu, giúp hạn chế lỗi bảo mật XSS. File CSS, JavaScript, ảnh đặt trong thư mục static và gọi bằng url_for('static', filename=...).
Xử lý form
Ví dụ một form đăng ký nhận tin đơn giản:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
nguoi_dang_ky = []
@app.route("/dang-ky", methods=["GET", "POST"])
def dang_ky():
if request.method == "POST":
email = request.form.get("email", "").strip()
if email:
nguoi_dang_ky.append(email)
return redirect(url_for("dang_ky"))
return render_template("dang_ky.html", danh_sach=nguoi_dang_ky)
Và file templates/dang_ky.html có form gửi theo phương thức POST:
<form method="post">
<input type="email" name="email" placeholder="Email của bạn" required>
<button type="submit">Đăng ký</button>
</form>
<p>Đã có {{ danh_sach|length }} người đăng ký.</p>
Chuyển hướng (redirect) sau khi xử lý POST giúp tránh việc trình duyệt gửi lại form khi người dùng nhấn F5. Ở dự án thật, dữ liệu nên lưu vào cơ sở dữ liệu (SQLite, PostgreSQL qua tiện ích Flask-SQLAlchemy) và form nên có bảo vệ CSRF (tiện ích Flask-WTF).
Đưa ứng dụng lên server

Lệnh flask run khởi động một server phát triển, không được thiết kế để chịu tải hay chống tấn công. Khi đưa lên mạng, hãy dùng một WSGI server:
pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 app:app
Trên Windows, Gunicorn không chạy được, bạn dùng Waitress: waitress-serve --port=8000 app:app. Phía trước nên đặt Nginx hoặc Caddy để phục vụ file tĩnh và bật HTTPS. Nếu không muốn tự quản lý máy chủ, các nền tảng như Render, Railway, PythonAnywhere hay Google Cloud Run đều chạy Flask tốt.
Trước khi triển khai, xuất danh sách thư viện để server cài đúng phiên bản:
pip freeze > requirements.txt
Học gì tiếp theo
- Blueprint: chia ứng dụng lớn thành nhiều mô-đun (người dùng, bài viết, quản trị).
- Flask-SQLAlchemy và Flask-Migrate: làm việc với cơ sở dữ liệu và quản lý thay đổi cấu trúc bảng.
- Flask-Login: đăng nhập, đăng xuất, ghi nhớ phiên.
- Trả về JSON: hàm trả về dict là Flask tự chuyển thành JSON, đủ để viết API cho ứng dụng di động.
- Kiểm thử với pytest và
app.test_client().
Một bài tập hay để luyện: biến script Python sẵn có thành ứng dụng web, ví dụ dựng giao diện web cho bảng quản lý tài chính cá nhân bằng Python.
Câu hỏi thường gặp
Flask có miễn phí không?
Có. Flask là phần mềm mã nguồn mở theo giấy phép BSD-3-Clause, dùng miễn phí cả cho dự án thương mại.
Học Flask cần biết gì trước?
Python cơ bản (biến, hàm, list, dict) và một chút HTML. Biết CSS, JavaScript sẽ giúp giao diện đẹp hơn nhưng không bắt buộc lúc đầu.
Flask có làm được website lớn không?
Được, nếu tổ chức code bằng Blueprint và chọn đúng tiện ích mở rộng. Tuy nhiên với website nhiều chức năng quản trị, Django thường giúp tiết kiệm thời gian hơn.
Flask có hỗ trợ async không?
Từ Flask 2.0, bạn có thể viết hàm xử lý dạng async def, nhưng Flask vẫn là framework WSGI. Ứng dụng cần xử lý rất nhiều kết nối đồng thời nên cân nhắc FastAPI hoặc Quart.
Vì sao thay đổi code mà trang không cập nhật?
Bạn chưa bật --debug nên server không tự khởi động lại. Với file CSS, thử nhấn Ctrl + F5 để xóa bộ nhớ đệm trình duyệt.
Kết luận
Flask là điểm khởi đầu nhẹ nhàng nhất để bước từ Python sang lập trình web: cài đặt trong vài phút, trang đầu tiên chỉ vài dòng code, và mọi khái niệm bạn học đều dùng lại được khi chuyển sang Django hay FastAPI. Hãy bắt đầu bằng một dự án nhỏ bạn thật sự cần, như danh sách việc cần làm hay trang ghi chép chi tiêu, rồi bổ sung dần cơ sở dữ liệu, đăng nhập và triển khai lên server.

Bình luận
Chưa có bình luận nào. Bạn có câu hỏi hay kinh nghiệm riêng về chủ đề này? Hãy là người mở đầu.