Flask là một micro-framework Python lý tưởng cho việc tạo RESTful API. Nếu bạn đang làm đồ án môn học hay bài tập lớn, việc xây dựng một API hỗ trợ CRUD (Create – Read – Update – Delete) sẽ giúp bạn làm quen với kiến trúc backend, xử lý JSON và giao tiếp giữa client-server. Trong bài viết này, bạn sẽ từng bước hướng dẫn bạn.
Thiết lập môi trường và cài đặt gói cần thiết
Trước hết, bạn cần tạo một thư mục dự án và tạo virtual environment để cách ly thư viện:
mkdir flask_crud_api cd flask_crud_api python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate
Tiếp theo cài đặt các thư viện cần dùng:
pip install flask flask-restful flask_sqlalchemy
Ở đây:
Flask tạo web framework cơ bản.
Flask-RESTful hỗ trợ nhanh việc định nghĩa tài nguyên và endpoint.
Flask-SQLAlchemy giúp bạn xử lý database theo ORM đơn giản.
Cấu trúc thư mục dự án phù hợp cho CRUD API
Tổ chức thư mục rất quan trọng để ứng dụng dễ đọc, bảo trì và mở rộng sau này. Ví dụ:
flask_crud_api/ │ ├── app.py # Entry point chính ├── models.py # Định nghĩa Model & database ├── resources.py # Định nghĩa endpoint CRUD ├── database.db # SQLite database file └── requirements.txt # Danh sách thư viện
Bạn nên giữ cấu trúc gọn nhưng rõ ràng, phù hợp cho cả đồ án và làm khóa luận.
Xây dựng model và kết nối database
Trong models.py, thêm code sau để định nghĩa bảng Item có các trường cơ bản:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
price = db.Column(db.Float, nullable=False)
def json(self):
return {'id': self.id, 'name': self.name, 'price': self.price}
Hàm json() giúp item dễ trả về qua API.
Viết endpoint CRUD bằng Flask-RESTful
Tạo file resources.py, định nghĩa tài nguyên ItemResource và ItemListResource:
from flask_restful import Resource, reqparse
from models import Item, db
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='Name cannot be blank')
parser.add_argument('price', type=float, required=True, help='Price must be a float')
class ItemResource(Resource):
def get(self, item_id):
item = Item.query.get(item_id)
if item:
return item.json(), 200
return {'message': 'Item not found'}, 404
def put(self, item_id):
data = parser.parse_args()
item = Item.query.get(item_id)
if item:
item.name = data['name']
item.price = data['price']
else:
item = Item(id=item_id, name=data['name'], price=data['price'])
db.session.add(item)
db.session.commit()
return item.json(), 200
def delete(self, item_id):
item = Item.query.get(item_id)
if item:
db.session.delete(item)
db.session.commit()
return {'message': 'Item deleted'}, 200
return {'message': 'Item not found'}, 404
class ItemListResource(Resource):
def get(self):
return {'items': [item.json() for item in Item.query.all()]}, 200
def post(self):
data = parser.parse_args()
item = Item(name=data['name'], price=data['price'])
db.session.add(item)
db.session.commit()
return item.json(), 201
Khởi tạo ứng dụng và đăng ký các resource
Trong app.py, tạo Flask app, kết nối database và đăng ký các URL:
from flask import Flask
from flask_restful import Api
from models import db
from resources import ItemResource, ItemListResource
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
api = Api(app)
api.add_resource(ItemListResource, '/items')
api.add_resource(ItemResource, '/items/<int:item_id>')
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
Chạy python app.py, API sẽ hoạt động trên http://127.0.0.1:5000.
Test API nhanh qua POSTMAN hoặc CURL
Bạn có thể dùng các lệnh sau kiểm tra:
POST tạo item:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Book","price":29.9}' http://localhost:5000/items- GET tất cả items:
curl http://localhost:5000/items
GET item theo id:
curl http://localhost:5000/items/1
PUT cập nhật item:
curl -X PUT -H "Content-Type: application/json" -d '{"name":"NewBook","price":39.9}' http://localhost:5000/items/1
- DELETE xóa item:
curl -X DELETE http://localhost:5000/items/1
Xử lý lỗi và bảo mật cơ bản
Nếu không có field cần thiết,
reqparsesẽ trả lỗi 400 với hint bạn thiết lập.Validations đơn giản được thực hiện qua kiểu dữ liệu của các argument.
Đối với đồ án, để bảo vệ tốt hơn, bạn có thể thêm xác thực token hoặc API key đơn giản bằng decorator.
Mở rộng API
Tùy theo nội dung thực hiện, bạn có thể nâng cấp như:
Giao diện frontend (React/Vue/HTML template) gọi API.
Phân trang (
limit,offset) cho GET list.Nâng cấp lên SQL Server hoặc PostgreSQL.
Thêm chức năng xác thực, phân quyền, ghi log.
Thêm unit test để kiểm tra endpoint.
Kết luận
Việc xây dựng một CRUD API với Flask không hề phức tạp nếu bạn biết cách chia nhỏ từng bước. Từ việc thiết lập môi trường, tổ chức dự án rõ ràng, định nghĩa database bằng SQLAlchemy, cho đến việc viết các endpoint bằng Flask-RESTful — tất cả đều có thể áp dụng vào thực tế như đồ án, bài tập nhóm, hoặc làm nền tảng cho các dự án lớn hơn.
Flask tuy là micro-framework nhưng lại cực kỳ linh hoạt và dễ mở rộng. Nếu bạn đã hiểu được nguyên lý hoạt động qua bài viết này, bạn hoàn toàn có thể nâng cấp hệ thống lên JWT, bảo mật bằng Token, dùng PostgreSQL, triển khai trên cloud hoặc tích hợp với React/Vue để hoàn thiện một ứng dụng full-stack.









