Xây dựng một RestFul API đơn giản với python và Flask

Introduction

Việc xây dựng 1 API trong python là khá dễ dàng. Trong bài viết này, chúng ta sẽ cùng tạo ra một REST API đơn giản bằng python với sự hỗ trợ của Flask Framework.

REST API là gì?

Thiết kế REST hay RESTful API (State Representational State Transfer) được thiết kế để tận dụng các giao thức hiện có. Mặc dù REST có thể được sử dụng trên hầu hết các giao thức, nhưng thường sử dụng HTTP khi được sử dụng cho các API Web. Điều này có nghĩa là các nhà phát triển không cần cài đặt thư viện hoặc phần mềm bổ sung để tận dụng thiết kế REST API. Thiết kế API REST được định nghĩa bởi Tiến sĩ Roy Fielding trong luận án tiến sĩ năm 2000 của ông. Điều đáng chú ý là lớp linh hoạt không thể tin được của nó. Vì dữ liệu không gắn với các phương pháp và tài nguyên, REST có khả năng xử lý nhiều loại cuộc gọi, trả lại các định dạng dữ liệu khác nhau và thậm chí thay đổi cấu trúc với việc thực hiện đúng của hypermedia.
Sự tự do và sự linh hoạt của nó trong thiết kế API REST cho phép bạn xây dựng một API đáp ứng nhu cầu của bạn đồng thời đáp ứng được nhu cầu của rất nhiều khách hàng khác nhau. Không giống như SOAP, REST không bị giới hạn bởi XML, mà có thể trả về XML, JSON, YAML hoặc bất kỳ định dạng nào tùy thuộc vào yêu cầu của khách hàng. Và không giống như RPC, người dùng không bắt buộc phải biết tên thủ tục hoặc các thông số cụ thể theo thứ tự cụ thể.

Giờ để tạo một REST API đơn giản sử dụng python, chúng ta cần những thứ sau:

  • Python
  • Flask
  • Flask-SQLAlchemy
  • Flask-Restful
  • SQlite3
  • Jsonify

Nói thêm một chút, Flask là một micro framework viết bằng Python và dựa trên bộ công cụ Werkzeug và công cụ mẫu Jinja2. Còn Flask RESTful là một phần mở rộng cho Flask mà thêm hỗ trợ cho việc nhanh chóng xây dựng các API REST.

Bắt đầu thôi nào!

Bạn có thể tải tập dữ liệu Employees và Tracks Details Employees and Tracks Details và giải nén trong thư mục dự án có tên "python_rest". Tên cơ sở liệu là "chinook.db". Sau khi tải về, hãy tạo một tệp có tên là server.py trong thư mục python_rest. Tập tin này sẽ chứa các API Definitions và Flask Code.

$ python_rest ls
chinook.db server.py

Bây giờ, chúng ta tạo ra một môi trường ảo cơ bản cho Python2.7 và cài đặt các gói sau khi nó được kích hoạt.

$ virtualenv venv
$ source venv/bin/activate
$ pip install flask flask-jsonpify flask-sqlalchemy flask-restful
$ pip freeze

REST có 4 options:

  • GET
  • PUT
  • POST
  • DELETE

Trong bài viết này chúng ta sẽ làm việc với GET Trước khi code, chúng ta cần kiểm tra kết nối với cơ sở dữ liệu.

(.venv) python_rest$ sqlite3 chinook.db 
SQLite version 3.19.3 2017-06-08 14:26:16
Enter ".help" for usage hints.
sqlite> 

Bây giờ mọi thứ đã được thiết lập, chúng ta bắt đầu thao tác với cơ sở dữ liệu để lấy ra thông tin employees và tracks

from flask import Flask, request
from flask_restful import Resource, Api
from sqlalchemy import create_engine
from json import dumps
from flask.ext.jsonpify import jsonify

app = Flask(__name__)
api = Api(app)

db_connect = create_engine('sqlite:///chinook.db')
conn = db_connect.connect() #kết nối với cơ sở dữ liệu

class Employees(Resource):
    def get(self):
        query = conn.execute("select * from employees") # Dòng này thực hiện truy vấn và trả về json
        return {'employees': [i[0] for i in query.cursor.fetchall()]} # Tìm và thêm cột đầu tiên là Employee ID

class Tracks(Resource):
    def get(self):
        query = conn.execute("select trackid, name, composer, unitprice from tracks;")
        result = {'data': [dict(zip(tuple (query.keys()) ,i)) for i in query.cursor]}
        return jsonify(result)

class Employees_Name(Resource):
    def get(self, employee_id):
        query = conn.execute("select * from employees where EmployeeId =%d "  %int(employee_id))
        result = {'data': [dict(zip(tuple (query.keys()) ,i)) for i in query.cursor]}
        return jsonify(result)
        

api.add_resource(Employees, '/employees') # Route_1
api.add_resource(Tracks, '/tracks') # Route_2
api.add_resource(Employees_Name, '/employees/<employee_id>') # Route_3

if __name__ == '__main__':
     app.run()

Sẽ có 3 routes được tạo ra và đây là kết quả:
http://127.0.0.1:5000/employees sẽ hiển thị tất cả id của employees trong cơ sở dữ liệu http://127.0.0.1:5000/tracks hiển thị các tracks detail http://127.0.0.1:5000/employees/2 hiển thị ra employees detail với id = 2

Tổng kết

Vậy là xong, chúng ta đã tạo ra được 1 REST API đơn giản sử dụng python với Flask. Cũng không quá phức tạp phải không! Cảm ơn các bạn đã dành thời gian đọc bài viết của mình. Bạn cũng có thể tìm hiểu Flask và Flask RESTful ở đây
http://flask.pocoo.org/
https://flask-restful.readthedocs.io/en/latest/

Tài liệu tham khảo

https://www.codementor.io/sagaragarwal94/building-a-basic-restful-api-in-python-58k02xsiq