Flask là công cụ mạnh mẽ để xây dựng REST API một cách nhanh chóng và linh hoạt. Flask đáp ứng hiệu quả các nhu cầu từ kết nối với ứng dụng web, mobile hay tích hợp với hệ thống thứ 3,… Trong bài viết này, hãy cùng ITviec bắt đầu những bước cơ bản nhất để tạo một Flask API đơn giản nhé.
Đọc bài viết để hiểu rõ hơn:
- Flask API là gì? Vì sao nên chọn Flask để xây dựng API?
- Một số hạn chế của framework Flask là gì?
- Hướng dẫn cách tạo API đầu tiên của bạn bằng Flask
- So sánh điểm khác biệt giữa Flask API và các REST API khác trong Python
- Giải đáp các câu hỏi thường gặp về Flask API
Flask là gì? API (REST API) là gì? Vì sao nên chọn Flask để xây dựng API?
Flask là gì?
Flask là một micro framework phổ biến của Python, thường được sử dụng để xây dựng các ứng dụng web và API. Với Flask, lập trình viên có thể dễ dàng tạo ra các API RESTful để phục vụ cho các ứng dụng phần mềm khác.
Đọc thêm: Flask là gì? Ứng dụng của Flask trong lập trình Python hiện đại
API (REST API) là gì?
API (Application Programming Interface) là một tập hợp các định nghĩa và giao thức cho phép các ứng dụng phần mềm giao tiếp với nhau. API cung cấp các điểm truy cập (endpoints) để các hệ thống có thể gửi yêu cầu (request) và nhận phản hồi (respone) cho một định dạng nhất định.
REST API là một kiểu API tuân theo nguyên tắc của kiến trúc REST. Nó sử dụng giao thức HTTP để thực hiện các thao tác như lấy dữ liệu (GET
), tạo mới (POST
), cập nhật (PUT/PATCH
) hoặc xoác (DELETE
) tài nguyên, thường được biểu diễn dưới dạng JSON.
Đọc thêm: API là gì? 4 đặc điểm nổi bật của API
Vì sao nên chọn Flask để xây dựng API?
Flask là lựa chọn quen thuộc của nhiều lập trình viên khi xây dựng RESTful API cho các ứng dụng quy mô nhỏ đến vừa, nhờ các ưu điểm sau:
- Microframework nhẹ và tối giản: Cung cấp đúng những gì cần thiết để xây dựng ứng dụng web hoặc API, cho phép tạo API nhanh chóng với cấu hình tối thiểu, giúp đơn giản hóa quá trình phát triển.
- Có sẵn server phát triển: Giúp dễ dàng kiểm thử và debug API trong quá trình phát triển.
- Hỗ trợ Jinja2: Tích hợp engine template mạnh mẽ để xây dựng giao diện HTML hoặc phản hồi JSON một cách linh hoạt.
- Độ linh hoạt cao: Không áp đặt cấu trúc, dễ dàng tuỳ chỉnh theo từng dự án, độ linh hoạt cao hơn cả các framework lớn như Django.
- Kiểm soát chi tiết: Cho phép lập trình viên “làm chủ” toàn bộ hệ thống mà không bị ràng buộc bởi những quy tắc khuôn mẫu cố định.
- Dễ mở rộng: Hỗ trợ nhiều thư viện và plugin bên thứ ba như xác thực, kết nối cơ sở dữ liệu,…
- Thừa hưởng lợi thế lớn từ cộng đồng Python: Có tài nguyên mã nguồn dồi dào, hỗ trợ hiệu quả cho việc phát triển API.
Tuy nhiên, bạn cũng cần cân nhắc khi lựa chọn Flask vì framework này có một số hạn chế sau:
- Chức năng giới hạn: Vì là microframework, Flask chỉ cung cấp những thành phần cơ bản. Nếu cần tính năng phức tạp, bạn phải tích hợp thêm thư viện ngoài.
- Khó mở rộng khi dự án lớn: Dễ tiếp cận cho dự án nhỏ, nhưng khi ứng dụng mở rộng, việc quản lý phụ thuộc và cấu trúc dự án có thể trở nên phức tạp.
- Không tích hợp sẵn database: Cần dùng thêm thư viện như SQLAlchemy để làm việc với cơ sở dữ liệu.
- Tiềm ẩn rủi ro bảo mật: Giống mọi web framework khác, Flask có thể bị tấn công (SQL injection, XSS…). Lập trình viên cần nắm rõ và có biện pháp bảo mật phù hợp.
Sau khi hiểu rõ bản chất và các ưu – nhược điểm của Flask, bạn có thể bắt tay vào xây dựng API đơn giản bằng framework này với hướng dẫn chi tiết dưới đây.
Hướng dẫn chi tiết từng bước tạo API đầu tiên của bạn bằng Flask
Bước 1: Kiểm tra và cài đặt môi trường
Để tạo API đầu tiên, trước hết hãy đảm bảo bạn đã cài đặt Python và pip trên máy tính bằng cách kiểm tra phiên bản:
$ python --version
Python 3.10.4
$ pip --version
pip 22.0.4 from /usr/lib/python3/dist-packages/pip (python 3.10)
Nếu một trong hai lệnh trên không hoạt động, bạn có thể truy cập python.org để tải và cài đặt Python (pip đi kèm). Sau đó, tiến hành cài đặt Flask:
$ pip install flask
Collecting flask
...
Successfully installed Jinja2-3.1.1 MarkupSafe-2.1.1 Werkzeug-2.1.1 click-8.1.2 colorama-0.4.4 flask-2.1.1 itsdangerous-2.1.2
Ngoài ra, bạn nên sử dụng môi trường ảo (virtual environment – venv) để quản lý thư viện dễ dàng hơn, tránh xung đột giữa các dự án:
python -m venv .venv
Trong đó, “python -m venv .venv
” có tác dụng tạo môi trường ảo trong thư mục .venv của dự án.
Sau khi tạo .venv, bạn cần kích hoạt môi trường:
- Trên macOS / Linux:
source .venv/bin/activate
- Trên Windows:
.venv\Scripts\activate
Khi kích hoạt xong, dòng lệnh sẽ có tiền tố như:
(.venv) $
Sau đó bạn cài Flask hoặc bất kỳ thư viện nào bằng pip. Khi này, chúng chỉ tồn tại trong .venv, không ảnh hưởng tới hệ thống hoặc môi trường khác.
Bước 2: Tạo file chính app.py và viết API đầu tiên
Tạo file app.py và thêm đoạn mã đơn giản:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return {'message': 'Hello, World!'}
if __name__ == '__main__':
app.run(debug=True)
Trong terminal, chạy python app.py. Nếu chạy thành công, Flask sẽ hiển thị dòng: Running on http://127.0.0.1:5000/.
Khi này, bạn tiếp tục truy cập trình duyệt tại http://127.0.0.1:5000/, bạn sẽ thấy kết quả:
JSON { "message": "Hello, World!" }
Giải thích:
Flask (__name__)
: Khởi tạo ứng dụng Flask@app.route('/')
: Định nghĩa một endpoint tại đường dẫn /.debug=True
: Cho phép Flask tự động reload khi có thay đổi mã, giúp dễ dàng kiểm thử trong quá trình phát triển.
Bước 3: Xây dựng REST API với chức năng CRUD
Tiếp theo, ta sẽ tạo một REST API đơn giản hỗ trợ các thao tác CRUD (Create – Read – Update – Delete) trên một danh sách đối tượng. Đây là mô hình phổ biến trong phát triển web và backend.
Đầu tiên, bạn cần cập nhật app.py để tạo danh sách đơn giản và thực hiện các thao tác:
from flask import Flask, jsonify, request
app = Flask(__name__)
items = []
@app.route('/items', methods=['GET'])
def get_items():
return jsonify(items)
@app.route('/items', methods=['POST'])
def add_item():
data = request.get_json()
items.append(data)
return jsonify(data), 201
@app.route('/items/<int:index>', methods=['PUT'])
def update_item(index):
data = request.get_json()
items[index] = data
return jsonify(data)
@app.route('/items/<int:index>', methods=['DELETE'])
def delete_item(index):
item = items.pop(index)
return jsonify(item)
if __name__ == '__main__':
app.run(debug=True)
Đây là một REST API đơn giản sử dụng Flask, cho phép client quản lý danh sách các mục thông qua các phương thức HTTP tiêu chuẩn. Với mỗi route đã tạo, bạn có thể sử dụng các phương thức khác nhau. Cụ thể, các endpoint sau hiện đang được hỗ trợ:
- GET /items – Lấy danh sách các đối tượng
- POST /items – Tạo mới một đối tượng
- PUT /items/<index> – Cập nhật một đối tượng
- DELETE /items/<index> – Xóa một đối tượng
Bạn có thể gọi API POST đến endpoint/items theo nhiều cách khác nhau:
Curl -X POST http://127.0.0.1:5000/items \
-H "Content-Type: application/json" \
-d '{"name": "Bút bi", "price": 12000}'
Sau khi bạn gọi thành công API POST để thêm item vào danh sách, bạn có thể kiểm tra endpoint GET /items tại địa chỉ: http://127.0.0.1:5000/items, thì phản hồi JSON từ GET /items sẽ là:
[{"name": "Bút bi","price": 12000}]
Giờ bạn muốn cập nhật lại item đó (ở index 0):
curl -X PUT http://127.0.0.1:5000/items/0 \
-H "Content-Type: application/json" \
-d '{"name": "Bút mực", "price": 15000}'
Kết quả phản hồi JSON từ GET /items sẽ là:
[{"name": "Bút mực","price": 15000}]
Xoá item tại index 0 (DELETE /items/0):
curl -X DELETE http://127.0.0.1:5000/items/0
Kết quả phản hồi JSON từ GET /items sẽ là:
[ ]
Lưu ý: Đây chỉ là ví dụ đơn giản, danh sách items hiện đang được lưu tạm thời trong bộ nhớ (RAM). Do đó, mỗi khi bạn khởi động lại (reset) server, toàn bộ dữ liệu sẽ bị mất. Với sản phẩm thực tế, cần lưu vào cơ sở dữ liệu (database).
Với cấu trúc này, bạn đã sẵn sàng để mở rộng API tùy theo độ phức tạp mong muốn. Tuy nhiên, đây chưa phải là cấu trúc tối ưu cho quy mô lớn, vì mỗi route cần nhiều xử lý riêng biệt và chưa có tính tổ chức chặt chẽ.
Bước 4: Tổ chức code với Blueprint (nâng cao)
Blueprint là một thành phần trong Flask hoạt động như một ứng dụng Flask thu nhỏ. Thay vì tạo một ứng dụng mới, Blueprint cho phép tách riêng từng phần chức năng rồi tích hợp vào ứng dụng chính. Tính năng này rất hữu ích khi xây dựng nhiều phiên bản của API hoặc phân chia các nhóm chức năng trong cùng một ứng dụng.
Để bắt đầu với Blueprint, bạn có thể thực hiện các bước sau:
1. Tạo thư mục blueprints để chứa các module.
2. Trong thư mục này, tạo thư mục con basic_endpoints và thêm file_init_.py:
#blueprints/basic_endpoints/__init__.py
from flask import Blueprint, jsonify
basic_bp = Blueprint('basic_bp', __name__)
@basic_bp.route('/')
def hello():
return jsonify({'message': 'Hello from a Blueprint!'})
3. Cập nhật main.py để đăng ký blueprint này vào ứng dụng chính:
from flask import Flask
from blueprints.basic_endpoints import basic_bp
app = Flask(__name__)
app.register_blueprint(basic_bp)
if __name__ == '__main__':
app.run(debug=True)
Khi chạy main.py, bạn có thể truy cập http://127.0.0.1:5000/ và sẽ thấy JSON phản hồi như cũ. Tuy nhiên, mã nguồn đã được tổ chức rõ ràng hơn, dễ mở rộng và dễ bảo trì về sau.
Bước 5 (tùy chọn): Tạo giao diện HTML động với Jinja Template
Flask hỗ trợ Jinja template, cho phép lập trình viên render các trang HTML động thay vì chỉ trả về JSON như các API thông thường. Trước tiên, hãy tạo một thư mục tên là templates và một file example.html:
<!-- templates/example.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja Template Example</title>
</head>
<body>
<p>{{ top }}</p>
<p>{{ bottom }}</p>
</body>
</html>
Trong template này, bạn sẽ thấy hai biến top và bottom được đặt trong dấu {{ }}
. Đây là cú pháp đặc biệt của Jinja dùng để chèn dữ liệu Python vào HTML, cho phép nội dung hiển thị linh hoạt.
Tiếp theo, cần tạo một blueprint mới để xử lý việc render HTML từ Jinja. Tạo thư mục blueprints/jinja_demo và thêm file __init__.py như sau:
# blueprints/jinja_demo/__init__.py
from flask import Blueprint, render_template, request
jinja_bp = Blueprint('jinja_bp', __name__)
@jinja_bp.route('/jinja_template')
def jinja_example():
top = request.args.get('top', 'Default Top Text')
bottom = request.args.get('bottom', 'Default Bottom Text')
return render_template('example.html', top=top, bottom=bottom)
Đừng quên đăng ký blueprint này trong file main.py:
# main.py
from flask import Flask
from blueprints.jinja_demo import jinja_bp
app = Flask(__name__)
app.register_blueprint(jinja_bp)
if __name__ == '__main__':
app.run(debug=True)
Bây giờ, bạn có thể truy cập vào đường dẫn http://127.0.0.1:5000/jinja_template?top=top_text&bottom=bottom_text, bạn sẽ nhận được kết quả hiển thị tương ứng như sau:
Bước 6: Kiểm thử API
Sau khi xây dựng API, bạn nên tiến hành kiểm thử để đảm bảo các endpoint hoạt động đúng như mong đợi. Dưới đây là một số công cụ phổ biến có thể sử dụng:
- Postman hoặc Insomnia: Giao diện trực quan, dễ sử dụng, hỗ trợ kiểm thử các request HTTP như
GET
,POST
,PUT
,DELETE
. - curl: Công cụ dòng lệnh nhanh gọn, tiện cho môi trường terminal hoặc khi viết script tự động.
- Mockoon: Hữu ích khi mock API – tức là giả lập phản hồi từ backend trong khi backend thực tế chưa sẵn sàng. Rất phù hợp khi frontend và backend phát triển song song.
Sau khi sử dụng Flask để xây dựng các endpoint phục vụ trao đổi dữ liệu qua giao thức HTTP, bạn sẽ tạo ra một Flask API. Đây chính là một RESTful API nhẹ, dễ triển khai và phù hợp cho nhiều loại ứng dụng, từ web đến mobile hoặc hệ thống microservice.
So sánh điểm khác biệt giữa Flask API và các REST API khác trong Python
Ngoài Flask API, Python còn bao gồm nhiều REST API nổi bật khác như Django REST, FastAPI, Pyramid, Falcon, Bottle, Eve, Sanic, Tornado, Hug. Dưới đây là bảng so sánh tổng quan điểm khác biệt giữa Flask API và 2 API điển hình khác là Django REST và FastAPI.
REST API | Hiệu suất | Cộng đồng | Mục đích |
Django REST framework | Trung bình vì có nhiều thành phần và phụ thuộc | Cộng đồng lớn | Xây dựng ứng dụng web full-stack có cả frontend và backend |
Flask RESTful | Nhẹ, nhanh | Cộng đồng lớn | Xây dựng API nhẹ, tách biệt frontend/backend |
FastAPI | Nhanh, bất đồng bộ | Cộng đồng đang phát triển | Xây dựng API hiệu suất cao |
Các câu hỏi thường gặp về Flask API
Flask có phù hợp để viết API không?
Flask là một lựa chọn tuyệt vời để xây dựng API nhờ vào sự đơn giản, linh hoạt và hệ sinh thái mở rộng phong phú hỗ trợ các tính năng như tạo tài liệu, xác thực và triển khai.
Flask có phải là API backend không?
Flask hoàn toàn có thể được sử dụng làm nền tảng backend để xây dựng API, cung cấp dữ liệu cho các ứng dụng giao diện người dùng hoặc tích hợp với dịch vụ bên thứ ba (third-party service) như ứng dụng di động (iOS, Android), hệ thống thanh toán (Paypal, Stripe),…
Flask API có dùng được trong môi trường production không?
Flask API có thể dùng trong môi trường production, nhưng cần một số cấu hình và công cụ bổ trợ để đảm bảo hiệu năng, bảo mật và khả năng mở rộng. Nhiều công ty lớn đã triển khai hệ thống production với Flask nhờ tính linh hoạt và dễ mở rộng của nó.
Flask thường được dùng trong những trường hợp nào?
Flask thường được sử dụng trong các trường hợp như xây dựng RESTful API, phát triển microservices, tạo dashboard quản trị, thử nghiệm ý tưởng (prototyping), và tích hợp với mô hình machine learning.
Tổng kết
Qua bài viết này, hy vọng bạn đã có cái nhìn tổng quan về Flask API và cách tạo một API đầu tiên chỉ với vài dòng code. Dù chỉ là một micro framework, Flask vẫn là lựa chọn mạnh mẽ và linh hoạt cho cả người mới học lẫn các dự án thực tế quy mô nhỏ đến vừa. Nếu bạn đang tìm cách bắt đầu hành trình lập trình backend bằng Python, thì Flask chính là bước khởi đầu lý tưởng. Hãy tiếp tục học hỏi và trau dồi để “rành nghề” hơn với micro framework này nhé.