Hướng dẫn cách sử dụng REST API trong Flask với SQLAlchemy và Marshmallow

Chào các bạn,

Trong bài viết này tôi sẽ hướng dẫn cách sử dụng REST API ( Create, Read, Update, Delete) trong flask với SQLAlchemy như là cơ sở dữ liệu và Marshmallow như là một schema để dễ dàng chuyển đổi dữ liệu từ SQLAlchemy sang định dạng JSON.

1) Nhập các thư viện cần thiết. Chúng ta cần module SQLAlchemy cho phương thức lưu trữ dữ liệu và module Marshmallow cho việc tạo đối tượng marshmallow.

from flask import Flask, request
from flask.json import jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

2) Khởi tạo ứng dụng flask.

# Init app
app = Flask(__name__)

3) Khởi tạo database với SQLAchemy, chúng ta đặt tên cơ sở dữ liệu là db.db.

# Database
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# Init db
db = SQLAlchemy(app)

4) Khởi tạo marshmallow (lưu ý là chúng ta phải khởi tạo cơ sở dữ liệu ở bước 3 trước rồi mới khởi tạo marshmallow).

# Init ma
ma = Marshmallow(app)

5) Tạo table trong SQLAlchemy có tên Product. Ở đây chúng ta sử dụng khai báo class cho Product, có kế thừa từ một class mẹ là Model mà class Product sử dụng để khai báo một mô hình mà người dùng định nghĩa (user -defined model).

Chúng ta tạo 5 cột cho table Product: id ( là primary_key, tự động tăng cho mỗi dòng dữ liệu), name (tên sản phẩm), description (mô tả sản phẩm), price (giá thành) và qty (số lượng).

class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True)
    description = db.Column(db.String(200))
    price = db.Column(db.Float)
    qty = db.Column(db.Integer)

    def __init__(self, name, description, price, qty):
        self.name = name
        self.description = description
        self.price = price
        self.qty = qty

6) Tạo một class ProductSchema để định nghĩa định dạng dữ liệu đầu ra với Marshmallow. Ở đây, đầu ra của đối tượng ProductSchema là một dạng tuple với 5 thành phần là giá trị của 5 cột trong bảng dữ liệu Product .

Sau đó chúng ta sẽ khởi tạo 2 đối tượng của class ProductSchemaproduct_schema (định dạng cho một đối tượng của class Product) và products_schema (định dạng cho nhiều đối tượng của class Product).

class ProductSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'description', 'price', 'qty')
# Init schema
product_schema = ProductSchema()
products_schema = ProductSchema(many=True)

7) Chương trình cho việc nhận thông tin từ phía client gửi lên (POST method), lưu thông tin vào bảng dữ liệu Product, sau đó trả về phía client thông tin đã lưu dưới dạng JSON. Dữ liệu mà client gửi tới phải có dạng là JSON, chúng ta lấy dữ liệu thông qua hàm request của flask.

Chúng ta lưu dữ liệu vào trong bảng bằng hàm add() và sau đó là commit().

# Create a product
@app.route('/product', methods=['POST'])
def add_product():
    name = request.json['name']
    description = request.json['description']
    price = request.json['price']
    qty = request.json['qty']

    new_product = Product(name, description, price, qty)

    db.session.add(new_product)
    db.session.commit()

    return product_schema.jsonify(new_product)

8) Chương trình để trả về cho client tất cả các dữ liệu trong bảng (GET method). Sử dụng hàm query.all() để lấy tất cả dữ liệu trong bảng.

# Get All Product
@app.route('/product', methods=['GET'])
def get_products():
    try:
        all_products = Product.query.all()
        result = products_schema.dump(all_products)
        return jsonify(result)
    except:
        return {"GET Error": str(e)}, 400

9) Trả về cho phía client thông tin của một sản phẩm dựa trên id của sản phẩm (GET method)

# Get Single Product
@app.route('/product/<id>', methods=['GET'])
def get_product(id):
    try:
        product = Product.query.get(id)

        return product_schema.jsonify(product), 200
    except Exception as e:
        return {"GET Error" : str(e)}, 400

10) Chương trình khi client cập nhập thông tin cho một sản phẩm đã tồn tại trong bảng dữ liệu: lấy thông tin cập nhập từ client, lưu vào bảng dữ liệu rồi sau đó trả về phía client thông tin sản phẩm dưới dạng JSON. Ở đây chúng ta dùng hàm query.get() để lấy đúng row của sản phẩm mà client yêu cầu cập nhập.

# Update a product
@app.route('/product/<id>', methods=['PUT'])
def update_product(id):
    try:
        product = Product.query.get(id)

        name = request.json['name']
        description = request.json['description']
        price = request.json['price']
        qty = request.json['qty']

        product.name = name
        product.description = description
        product.price = price
        product.qty = qty

        db.session.commit()

        return product_schema.jsonify(product), 204
    except Exception as e: 
        return {"Update error" : str(e)}, 400

11) Chương trình khi client yêu cầu xoá một sản phẩm: trả về cho client row sản phẩm client muốn xoá với hàm query.get(), sau đó cập nhập bảng dữ liệu với hàm delete()commit().

# Delete Product
@app.route('/product/<id>', methods=['DELETE'])
def delete_product(id):
    try:
        product = Product.query.get(id)
        db.session.delete(product)
        db.session.commit()
        return product_schema.jsonify(product), 200
    except Exception as e:
        return {"Update error" : str(e)}, 400

12) Chạy server.

# Run Server
if __name__ == '__main__':
    app.run(debug=True)

 

Bài viết đến đây là hết. Hy vọng qua bài viết này các bạn có thể dễ dàng thao tác với REST API trong flask với cơ sở dữ liệu là SQLAlchemy và dùng Marshmallow để chuyển đổi định dạng dữ liệu từ table sang JSON.

About Author

Chia sẻ bài viết

Leave a Comment

Your email address will not be published. Required fields are marked *