Cách xây dựng một RESTful API Python đơn giản với Flask trong 3 phút

Chào các bạn, hôm nay mình sẽ viết và giới thiệu đến các bạn cách đơn giản để xây dựng một RESTful API Python với Flask. Chắc hẳn nếu các bạn muốn xây dựng các services thì RESTful API là không thể thiếu đúng không nào. Đối với ngôn ngữ Python thì phổ biến nhất là dùng Flask để tạo API.

Bài viết này dành cho các bạn đã có kiến thức lập trình Python cơ bản rồi nhé. Còn các bạn mới học Python sẽ có các bài hướng dẫn học Python cơ bản sau nhé. Bắt đầu thôi nào !!!

1. Cài đặt Flask

Để xây dựng một RESTful API với flask thì dĩ nhiên cần cài đặt Flask rồi, bạn cài đặt 2 package dưới đây nhé, dùng lệnh pip cơ bản thôi:

pip install flask
pip install flask-sqlalchemy

Sau đó chúng ta sẽ tạo một thư mục cho dự án mẫu này nhé:

mkdir my_app

2. Chuẩn bị project Flask

Mình sẽ ví dụ bằng một ứng dụng nhỏ, trong đó xây dựng một model Product. Project dự án sẽ có dạng như sau:

flask_app/
    my_app/
        - __init__.py
        product/
            - __init__.py      // Empty file
            - models.py
            - views.py
    - run.py

3. Bắt tay vào coding thôi nào

File init: flask_app/my_app/init.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
 
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
 
from my_app.product.views import product
app.register_blueprint(product)
 
db.create_all()

File phía trên là file cấu hình và khởi tạo ứng dụng, ở đây chúng ta sẽ dùng sqlite cho đơn giản nhé

Tiếp tục là file model: flask_app/my_app/product/models.py

from my_app import db
 
class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255))
    price = db.Column(db.Float(asdecimal=True))
 
    def __init__(self, name, price):
        self.name = name
        self.price = price
 
    def __repr__(self):
        return '<Product %d>' % self.id

Chúng ta tạo 1 file có chức năng route. Có nhiều cách xử lý route với Flask, ở đây mình chọn dùng pluggable view.

File views: flask_app/my_app/product/views.py

import json
from flask import request, jsonify, Blueprint, abort
from flask.views import MethodView
from my_app import db, app
from my_app.catalog.models import Product
 
product = Blueprint('product', __name__)
 
@product.route('/')
@product.route('/home')
def home():
    return "Welcome to the Product Home."
 
 
class ProductView(MethodView):
 
    def get(self, id=None, page=1):
        if not id:
            products = Product.query.paginate(page, 10).items
            res = {}
            for product in products:
                res[product.id] = {
                    'name': product.name,
                    'price': str(product.price),
                }
        else:
            product = Product.query.filter_by(id=id).first()
            if not product:
                abort(404)
            res = {
                'name': product.name,
                'price': str(product.price),
            }
        return jsonify(res)
 
    def post(self):
        name = request.form.get('name')
        price = request.form.get('price')
        product = Product(name, price)
        db.session.add(product)
        db.session.commit()
        return jsonify({product.id: {
            'name': product.name,
            'price': str(product.price),
        }})
 
    def put(self, id):
        # Update the record for the provided id
        # with the details provided.
        return
 
    def delete(self, id):
        # Delete the record for the provided id.
        return
 
 
product_view =  ProductView.as_view('product_view')
app.add_url_rule(
    '/product/', view_func=product_view, methods=['GET', 'POST']
)
app.add_url_rule(
    '/product/<int:id>', view_func=product_view, methods=['GET']
)

4. Chạy chương trình thôi nào

Bạn hãy thêm dòng này vào file run.py

from my_app import app
app.run(debug=True)

Sau đó là chạy thử thôi nào

python run.py

Port mặc định của Flask là 5000, nếu bạn chạy bằng trình duyệt thì nhớ thêm port này nhé.

http://localhost:5000/

CHÚC BẠN THÀNH CÔNG !

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x