Flask là gì? Hướng dẫn xây dựng web API với Python cho người mới (2026)
Flask là một micro web framework viết bằng Python, được tạo ra bởi Armin Ronacher (Pallets Projects) vào năm 2010. Tính đến năm 2026, Flask 3.x vẫn là một trong những lựa chọn hàng đầu để xây dựng REST API và ứng dụng web nhẹ bằng Python.
Nếu bạn đang tìm hiểu về Python và muốn bước tiếp vào lập trình web, Flask chính là cánh cửa dễ nhất để bắt đầu. Bài viết này sẽ giải thích Flask là gì, cách cài đặt, cách xây dựng REST API đơn giản và so sánh Flask với Django, FastAPI để bạn chọn đúng công cụ.
Flask là gì?
Flask là micro web framework cho Python, nghĩa là một framework web tối giản, linh hoạt. Từ "micro" ở đây không có nghĩa là yếu hay ít tính năng — mà có nghĩa là: core rất nhỏ gọn, chỉ bao gồm những thứ cần thiết nhất, và bạn hoàn toàn tự do thêm những gì bạn cần.
Flask được xây dựng trên nền tảng của hai thư viện:
- Werkzeug — WSGI toolkit, xử lý request/response và routing
- Jinja2 — Template engine để render HTML
Flask hoạt động theo mô hình WSGI (Web Server Gateway Interface) — một chuẩn kết nối giữa web server và ứng dụng Python. Đây là mô hình đồng bộ (synchronous) truyền thống, khác với mô hình async của FastAPI.
Nếu bạn chưa biết Python cơ bản, hãy đọc Python là gì? trước khi tiếp tục.
So sánh nhanh: Micro vs Full-stack Framework
Hãy tưởng tượng Django như một khách sạn 5 sao — có đầy đủ nhà hàng, hồ bơi, phòng gym. Flask giống như một căn hộ trống — bạn tự trang trí theo ý mình, chỉ mua những gì thực sự cần. Với những dự án nhỏ đến trung bình, căn hộ trống đó vừa nhẹ, vừa linh hoạt hơn nhiều.
Tại sao Flask phù hợp cho người mới?
Hello World chỉ 5 dòng code
Đây là ứng dụng Flask đơn giản nhất có thể:
# app.py — ứng dụng Flask đầu tiên
from flask import Flask
app = Flask(__name__) # khởi tạo ứng dụng Flask
@app.route('/') # định nghĩa URL gốc
def home():
return 'Chào mừng đến với Flask!'
if __name__ == '__main__':
app.run(debug=True) # chạy ở chế độ debugChỉ vậy thôi. Không cần file cấu hình phức tạp, không cần hiểu cấu trúc thư mục bắt buộc như Django. Chạy ngay và có kết quả ngay.
5 lý do Flask là lựa chọn tốt cho người mới
- Học nhanh — Biết Python cơ bản là đủ để tạo API trong 1-2 ngày
- Cấu trúc dự án tự do — Dự án nhỏ chỉ cần 1 file, không cần ép buộc theo khuôn mẫu
- Debug dễ dàng — Chế độ
debug=Truehiển thị lỗi chi tiết ngay trên browser - Tài liệu rõ ràng — Official docs của Flask rất dễ đọc và đầy đủ
- Cộng đồng lớn — Hàng triệu câu hỏi trên Stack Overflow, GitHub
Cài đặt Flask và tạo ứng dụng đầu tiên
Yêu cầu
- Python 3.8 trở lên
- Terminal (macOS/Linux) hoặc Command Prompt (Windows)
Bước 1: Tạo môi trường ảo
# Tạo thư mục dự án
mkdir my-flask-app
cd my-flask-app
# Tạo môi trường ảo
python -m venv venv
# Kích hoạt môi trường ảo
source venv/bin/activate # macOS / Linux
venv\Scripts\activate # WindowsMôi trường ảo giúp tách biệt các gói thư viện giữa các dự án — đây là best practice khi làm Python.
Bước 2: Cài đặt Flask
# Cài Flask
pip install flask
# Kiểm tra phiên bản
flask --version
# Flask 3.x.xBước 3: Tạo file app.py và chạy
# app.py — ứng dụng Flask cơ bản
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return '<h1>Xin chào Flask!</h1>'
@app.route('/about')
def about():
return 'Đây là trang giới thiệu'
if __name__ == '__main__':
app.run(debug=True)# Chạy ứng dụng
python app.py
# hoặc
flask runMở browser và truy cập http://127.0.0.1:5000 — bạn sẽ thấy "Xin chào Flask!" hiển thị.
Routing và URL trong Flask
Decorator @app.route() là gì?
Routing trong Flask sử dụng decorator @app.route() để kết nối URL với một hàm Python. Khi người dùng truy cập một URL, Flask sẽ gọi hàm tương ứng và trả về kết quả.
from flask import Flask
app = Flask(__name__)
# Route cố định
@app.route('/products')
def product_list():
return 'Danh sách sản phẩm'
# Route động — nhận tham số kiểu string
@app.route('/articles/<string:slug>')
def get_article(slug):
return f'Bài viết: {slug}'
# Route động — nhận tham số kiểu integer
@app.route('/products/<int:product_id>')
def get_product(product_id):
return f'Sản phẩm ID: {product_id}'Chỉ định HTTP Method
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
return f'Xin chào, {username}!'
else:
return 'Trang đăng nhập'Các kiểu URL variable
| Kiểu | Cú pháp | Ví dụ URL |
|---|---|---|
| string | <string:name> | /users/nguyen-van-a |
| int | <int:id> | /products/42 |
| float | <float:price> | /items/9.99 |
| path | <path:subpath> | /files/img/logo.png |
Xây dựng REST API với Flask
Nếu bạn chưa rõ REST API là gì, hãy đọc API là gì? trước. Phần này sẽ hướng dẫn bạn xây dựng một API quản lý người dùng hoàn chỉnh với đầy đủ CRUD (Create, Read, Update, Delete).
# app.py — Flask REST API đầy đủ
from flask import Flask, jsonify, request
app = Flask(__name__)
# Dữ liệu mẫu (thực tế sẽ dùng database)
users = [
{'id': 1, 'name': 'Nguyen Van A', 'email': 'a@example.com'},
{'id': 2, 'name': 'Tran Thi B', 'email': 'b@example.com'}
]
@app.route('/api/users', methods=['GET'])
def get_users():
return jsonify(users)
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = next((u for u in users if u['id'] == user_id), None)
if user is None:
return jsonify({'error': 'Không tìm thấy user'}), 404
return jsonify(user)
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
if not data or 'name' not in data:
return jsonify({'error': 'Thiếu thông tin name'}), 400
new_user = {
'id': len(users) + 1,
'name': data['name'],
'email': data.get('email', '')
}
users.append(new_user)
return jsonify({'message': 'Tạo user thành công', 'user': new_user}), 201
@app.route('/api/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
user = next((u for u in users if u['id'] == user_id), None)
if user is None:
return jsonify({'error': 'Không tìm thấy user'}), 404
data = request.get_json()
user.update(data)
return jsonify({'message': 'Cập nhật thành công', 'user': user})
@app.route('/api/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
global users
original_length = len(users)
users = [u for u in users if u['id'] != user_id]
if len(users) == original_length:
return jsonify({'error': 'Không tìm thấy user'}), 404
return jsonify({'message': 'Xóa user thành công'})
if __name__ == '__main__':
app.run(debug=True)HTTP Status Code thường gặp
| Code | Ý nghĩa | Dùng khi nào |
|---|---|---|
| 200 OK | Thành công | GET, PUT, DELETE thành công |
| 201 Created | Tạo thành công | POST tạo resource mới |
| 400 Bad Request | Lỗi request | Dữ liệu không hợp lệ |
| 404 Not Found | Không tìm thấy | ID không tồn tại |
| 500 Internal Server Error | Lỗi server | Lỗi không mong muốn |
Flask vs Django vs FastAPI — Nên chọn cái nào?
| Tiêu chí | Flask | Django | FastAPI |
|---|---|---|---|
| Loại | Micro framework | Full-stack framework | Micro framework |
| ORM tích hợp | Không (cần extension) | Có sẵn | Không (cần SQLAlchemy) |
| Độ khó học | Thấp | Trung bình – cao | Trung bình |
| Async mặc định | Không | Một phần | Có |
| Hiệu năng | Tốt | Tốt | Rất cao |
| Auto API docs | Không | Không | Có (Swagger) |
| Phù hợp nhất | Người mới, microservice, prototype | App lớn, cần admin panel, CMS | API hiệu năng cao, type-safe |
- Chọn Flask nếu: bạn mới học web với Python, muốn tạo API đơn giản, cần prototype nhanh
- Chọn Django nếu: dự án lớn, cần trang admin, làm CMS. Xem thêm Django là gì?
- Chọn FastAPI nếu: cần API hiệu năng cao, muốn dùng async/await, cần tự động generate API docs
Gợi ý: Bắt đầu với Flask để nắm vững nền tảng, sau đó chuyển sang Django hoặc FastAPI tùy nhu cầu. Xem lộ trình backend 2026 để có kế hoạch học tập chi tiết.
Extension Flask phổ biến
Sức mạnh của Flask nằm ở hệ sinh thái extension phong phú. Bạn chỉ cài thứ bạn cần:
Flask-SQLAlchemy — Kết nối database
pip install flask-sqlalchemyfrom flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)Flask-Login — Quản lý xác thực người dùng
pip install flask-loginXử lý session, login/logout, bảo vệ các route yêu cầu đăng nhập.
Flask-CORS — Cho phép frontend gọi API
pip install flask-corsfrom flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)| Extension | Chức năng |
|---|---|
| Flask-SQLAlchemy | ORM, kết nối database |
| Flask-Migrate | Database migration |
| Flask-Login | Authentication, session |
| Flask-CORS | Cross-Origin Resource Sharing |
| Flask-JWT-Extended | JWT token authentication |
| Flask-WTF | Form handling + CSRF protection |
| Flask-Mail | Gửi email |
Deploy ứng dụng Flask
Server tích hợp của Flask chỉ dùng cho phát triển. Trong production, dùng Gunicorn:
# Cài Gunicorn
pip install gunicorn
# Chạy production server
gunicorn -w 4 -b 0.0.0.0:8000 app:appDeploy lên Render.com (miễn phí)
- Tạo file
requirements.txt:pip freeze > requirements.txt - Push code lên GitHub
- Tạo tài khoản Render.com → New Web Service
- Kết nối GitHub repository
- Start Command:
gunicorn app:app - Deploy — nhận URL public
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]FAQ — Câu hỏi thường gặp về Flask
Flask có phù hợp để làm website thực tế không?
Hoàn toàn phù hợp. Nhiều startup và sản phẩm thực tế dùng Flask cho backend API. Flask đặc biệt mạnh trong microservices, Machine Learning API và backend cho Single Page App. Với traffic lớn, thêm Gunicorn và load balancer là đủ.
Flask khác Django như thế nào?
Flask là micro framework — nhẹ, linh hoạt, bạn tự chọn các thành phần cần dùng. Django là full-stack framework — tích hợp sẵn ORM, admin panel, form validation, authentication. Flask phù hợp cho API đơn giản và người mới; Django phù hợp cho ứng dụng phức tạp. Đọc thêm tại Django là gì?
Học Flask mất bao lâu?
Nếu đã biết Python cơ bản, bạn có thể tạo REST API đơn giản trong 1-2 ngày. Để tự tin làm CRUD API với database, cần khoảng 1-2 tuần. Xem lộ trình học Python 2026 để biết thứ tự học tối ưu.
Flask có hỗ trợ async không?
Flask 2.0+ cho phép dùng async def trong route handler, nhưng hiệu năng async thực sự không cao như FastAPI vì Flask vẫn dựa trên WSGI. Nếu cần async thực sự, hãy xem xét FastAPI hoặc Quart.
Flask có tích hợp database không?
Flask không tích hợp ORM sẵn, nhưng bạn có thể dùng Flask-SQLAlchemy để kết nối PostgreSQL, MySQL, SQLite. Flask-Migrate giúp quản lý migration. Xem Python là gì? để có nền tảng trước khi học SQLAlchemy.
Nên học Flask hay FastAPI trước?
Với người mới, nên học Flask trước. Flask giúp bạn hiểu rõ HTTP, routing, request/response cycle. Sau khi nắm vững Flask, chuyển sang FastAPI sẽ rất dễ. Xem lộ trình backend 2026 để có kế hoạch học tập rõ ràng.
Kết luận
Flask là điểm khởi đầu lý tưởng cho bất kỳ ai muốn học lập trình web với Python. Với thiết kế tối giản, linh hoạt và cộng đồng lớn, Flask cho phép bạn học từng bước mà không bị choáng ngợp.
- Flask = micro web framework Python, xây trên Werkzeug + Jinja2
- "Micro" = tự do tùy chỉnh, không phải yếu
- Hello World chỉ 5 dòng, dễ bắt đầu ngay
- Routing bằng decorator
@app.route() - REST API với
jsonify()vàrequest.get_json() - Extension như Flask-SQLAlchemy, Flask-Login giúp mở rộng khi cần
- Deploy production với Gunicorn trên Render hoặc Railway
Bước tiếp theo
- Chạy thử code CRUD API trong bài này trên máy tính của bạn
- Thêm Flask-SQLAlchemy để lưu dữ liệu vào database thực
- Xem lộ trình học Python 2026
- Tham khảo lộ trình backend 2026 cho kế hoạch dài hạn