Xây dựng dựng dụng REST API đơn giản với FLASK - Part 2

Chào các bạn, ở bài viết trước, mình đã cùng các bạn làm quen với Flask, một framework đơn giản và khá nhẹ nhàng của python dùng để xây dựng một RestFull API. Để tiếp nối series này, chúng ta cùng tìm hiểu cách xây dựng 1 ứng dụng CRUD với Flask nhé. Nào ta cùng bắt đầu.

CRUD là một thuật ngữ quen thuộc trong lập trình khi bạn làm việc với kho dữ liệu. Nó là viết tắt của các từ: Create, Read, Update, Delete. Một ứng dụng CRUD cung cấp đủ các các chức năng, thao tác với dữ liệu, mang đến những trải nghiệm ứng dụng tốt và thuận tiện cho người dùng.

Create

Ở bài viết trước, chúng ta đã tạo một database với một bảng có tên articles để lưu thông tin một bài viết. Hãy cùng tôi, tạo bài viết đầu tiên để lưu vào database nhé.

Việc insert dữ liệu vào database trải qua 3 bước

  • Tạo python object
  • Add objects vừa tạo vào session
  • Commit session

Trong file app.py bạn thêm vào đoạn import thư viện để có thể sử dụng được session, request...

from flask import Flask, session, jsonify, request, Response

Để chức năng này hoạt động, trước tiên, bạn cần phải định nghĩa phương thức HTTP là POST thì ứng dụng của bạn mới xác định được đây là chức năng tạo dữ liệu 😉

@app.route('/article', methods='POST')

Tạo function cho phép chúng ta tạo mới một dữ liệu:

def create_article():
    if request.method == 'POST':
        title = request.data.get('title')
        contents = request.data.get('contents')
        image = request.data.get('image')

        article = Article(title, contents, image)
        db.session.add(article)
        db.session.commit()

        return {'status': 'Create successfully'}

OK vậy là xong. Bây giờ bạn có hoàn toàn có thể insert dữ liệu đầu tiên của mình vào database rồi. Sau khi kho dữ liệu của bạn đã có dữ liệu, bạn hoàn toàn có thể get một hoặc nhiều dữ liệu để cung cấp thông tin cho người dùng.

READ

Để get 1 hoặc nhiều dữ liệu mình dùng flask_marshmallow, đây là một thư viện hỗ trợ để cung cấp cho bạn "beautiful APIs" 😉

install flask_marshallow

pip install flask-marshmallow

pip freeze > requirements.txt

import thư viện vaò file app.py của bạn

from flask_marshmallow import Marshmallow

Bên dưới dòng db = SQLAlchemy(app) bạn thêm vào đoạn khai báo sử dụng marshallow

ma = Marshmallow(app)

Tiếp theo hay định nghĩa output format với marshallow nào. Việc đầu tiên, bạn cần tạo 1 file có tên modelsschema.py để định nghĩa format này. Bài viết này mình hướng dẫn bạn tạo một format đơn giản nhất. có thể. Để có thể sử dụng nhuần nhuyễn thư viện này bạn có thể tham khảo tại đây

from app import ma
from models import *

class ArticleSchema(ma.ModelSchema):
    class Meta:
        model = Article

import file vừa tạo vào app.py

from modelschema import *

Với việc get dữ liệu thường có 2 loại: loại 1, get nhiều dữ liệu, dữ liệu trả về sẽ là 1 mảng objects, loại lại get 1 dữ liệu, dữ liệu chỉ trả về là 1 object.

VD: để lấy dữ liệu là 1 object, bạn có thể thực hiện như sau:

@app.route('article/<id>'')
def get_article(id):
    article_schema = ArticleSchema()
    article = Article.query.get(id)

    return {'article': article_schema.dump(article).data}

đổi với trường hợp get nhiều dữ liệu, đoạn khai báo Schema, hãy thêm vào many=True, để marshallow của bạn hiểu rằng bạn đạng muốn output là một mảng nhiều objects

@app.route('articles')
def get_article(id):
    article_schema = ArticleSchema(many=True)
    articles = Article.query.all()

    return {'articles': article_schema.dump(articles).data}

Update

Đối với việc update 1 phần tử, bạn cần thực hiện theo các bước

  • xác định đối tượng cần update
  • thay thế các giá trị cần sửa
  • commit session

Việc update 1 đối tượng, bạn có thế thực hiện như sau:

@app.route('/article/<id>', methods='PATCH')
def update_article(id):
    article_schema = ArticleSchema()
    article = ArticleSchema.query.get(id)
    
    if request.method == 'PATCH':
        title = request.data.get('title') # Ví dụ ở đây, mình chỉ thay thế title
        
        article.title = title
        db.session.commit()

        return {'article': article_schema.dump(article).data}

Delete

Tương tự với việc delete một record cũng hoàn toàn đơn giản, bạn chỉ cần xác định được đối tượng bạn cần xóa và thực hiện như sau:

@app.route('/article/<id>', methods='DELETE')
def update_article(id):
    article_schema = ArticleSchema()
    article = ArticleSchema.query.get(id)
    
    if request.method == 'DELETE':
        db.session.delete(article)
        db.session.commit()

        return {'status': "Record is deleted"}

Vậy là xong. Trên đây tôi đã hướng dẫn các bạn tạo 1 ứng dụng CRUD đơn giản với flask API. Các bạn có thể thử và trải nghiệm. Ở bài viết sau, chúng ta sẽ cùng xây dựng 1 ứng dụng cron-job với flask API nhé. Rất mong được các bạn ủng hộ.

Tham khảo: