07/09/2018, 09:55

Xây dựng một RESTful API đơn giản với Python Flask

Trong phạm vi bài viết, mình giả sử rằng các bạn đã có một sự hiểu biết cơ bản về Python cũng như thiết lập môi trường bằng virtualenv trước đó. Nếu chưa thì tin chắc rằng trên Viblo có rất nhiều bài hướng dẫn thiết lập cũng như các kiến thức cơ bản về Python. Ở đây mình sẽ dùng phiên bản Python ...

Trong phạm vi bài viết, mình giả sử rằng các bạn đã có một sự hiểu biết cơ bản về Python cũng như thiết lập môi trường bằng virtualenv trước đó.

Nếu chưa thì tin chắc rằng trên Viblo có rất nhiều bài hướng dẫn thiết lập cũng như các kiến thức cơ bản về Python. Ở đây mình sẽ dùng phiên bản Python 2.7

1. Cài đặt Flask

Chúng ta chỉ việc cài đặt thêm 2 package này

pip install flask
pip install flask-sqlalchemy

Và tạo thư mục dự án

mkdir my_app

2. Ứng dụng Flask

Ở đây mình sẽ tạo ra một ứng dụng nhỏ, trong đó có một model Product. Cây thư mục của dự án sẽ có dạng

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

Tất nhiên đây chỉ là một bài viết tạo RESTful API đơn giản nên chúng ta sẽ kiểm tra bằng cách gọi http chứ không đụng chạm tới front-end

3. Code một tí nào

  • 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 dùng sqlite cho nhanh gọn lẹ ha

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ắc không có gì phải giải thích nhỉ

Cuối cùng, chúng ta tạo 1 file có chức năng route, với Flask bạn không nhất thiết phải tạo hay config 1 file route chung, mà có thể đưa route vào một cách đơn giản như thế này thôi.

Có nhiều cách xử lý route với Flask, ở đây mình chọn dùng pluggable view cho nó trực quan và nếu bạn muốn phát triển thêm thắt front end vào thay vì chỉ là api với đống json thì cũng dễ dàng nữa.

  • 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 ngay đi

Chúng ta thêm cái này vào run.py

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

Sau đó vào terminal và gõ lệnh là chạy thôi

python run.py

À, nếu bạn muốn test trên trình duyệt thì cổng mặc định của Flask là 5000 nhé.

Tư liệu tham khảo: https://code.tutsplus.com/tutorials/building-restful-apis-with-flask-diy--cms-26625

0