Cách Xây Dựng API RESTFUL trong Flask bằng Gói flask-restful
By khoanc, at: 15:30 Ngày 09 tháng 3 năm 2023
Thời gian đọc ước tính: __READING_TIME__ phút
1. Giới thiệu
RESTFUL API (Giao diện lập trình ứng dụng truyền trạng thái biểu diễn) đóng một vai trò quan trọng trong việc cho phép giao tiếp và trao đổi dữ liệu giữa các hệ thống khác nhau trong bối cảnh phát triển web hiện nay. Điều này cung cấp một kiến trúc tiêu chuẩn cho phép các nhà phát triển thiết kế các dịch vụ web có khả năng mở rộng, linh hoạt và có khả năng tương tác. Nhờ các nguyên tắc REST, các nhà phát triển có thể tạo các API được cấu trúc tốt, có thể bảo trì và dễ dàng tiêu thụ bởi các ứng dụng khách.
Flask, một microframework phổ biến cho Python, cung cấp một nền tảng nhanh chóng, mạnh mẽ và linh hoạt để xây dựng các ứng dụng web, bao gồm cả API RESTFUL. Các đặc điểm nổi tiếng của nó là tối giản, mạnh mẽ và dễ dàng. Để tăng cường hơn nữa khả năng của Flask trong việc xây dựng API RESTFUL, gói flask-restful ra đời. Gói này đơn giản hóa quá trình tạo API RESTFUL trong Flask bằng cách cung cấp một bộ các tính năng và trình trang trí trực quan giúp hợp lý hóa việc phát triển API.
Trong bài đăng trên blog này, chúng ta sẽ thảo luận về quy trình xây dựng API RESTFUL trong Flask bằng cách sử dụng gói flask-restful. Chúng ta cũng sẽ đi sâu vào các khái niệm cơ bản của kiến trúc RESTFUL và những lợi ích của nó trong phát triển web hiện đại. Một ví dụ hoàn chỉnh được liệt kê ở cuối bài viết này.
2. Câu hỏi thường gặp
2.1 Làm thế nào để tạo API trong Python?
Tạo một API trong Python bằng flask-restful là một quy trình đơn giản, liên quan đến một vài bước đơn giản.
1. Cài đặt Flask và flask-restful
Mở Terminal và gõ các lệnh sau
pip install Flask
pip install flask-restful
2. Nhập các mô-đun cần thiết
from flask import Flask
from flask_restful import Api, Resource
3. Tạo một thể hiện của ứng dụng Flask và API flask-restful
app = Flask(__name__)
api = Api(app) # init the api with the current application
4. Xác định tài nguyên, điểm cuối và phương thức
Xác định tài nguyên của bạn dưới dạng các lớp kế thừa từ lớp Tài nguyên flask-restful. Trong các lớp này, hãy xác định các phương thức HTTP mà bạn muốn hỗ trợ, chẳng hạn như GET, POST, PUT, DELETE. Ví dụ:
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
def post(self):
pass
api.add_resource(HelloWorld, '/hello')
5. Chạy ứng dụng Flask
Ở cuối script của bạn, hãy thêm các dòng sau để chạy ứng dụng Flask:
if __name__ == '__main__':
app.run(debug=True)
2.2 Flask có tốt cho API không?
Có, Flask, một lựa chọn tuyệt vời để phát triển API, là một microframework nhẹ cho phép các nhà phát triển nhanh chóng xây dựng các ứng dụng web và API RESTFUL. Dưới đây là một số lý do tại sao Flask là một lựa chọn tốt để xây dựng API:
1. Tính linh hoạt: Flask cung cấp mức độ linh hoạt cao, cho phép các nhà phát triển tùy chỉnh và tinh chỉnh API của họ theo nhu cầu cụ thể của họ. Thiết kế tối giản của Flask cho phép bạn chọn các thành phần và thư viện bạn muốn sử dụng, cho bạn toàn quyền kiểm soát việc phát triển API của mình.
2. Sự đơn giản: Một cách tiếp cận đơn giản và trực quan để phát triển web là hướng dẫn của Flask. Framework có một API đơn giản và thanh lịch, dễ học và dễ hiểu, giúp nó dễ tiếp cận cho cả người mới bắt đầu và các nhà phát triển có kinh nghiệm.
3. Hệ sinh thái mở rộng: Nhờ dễ sử dụng và tích hợp, nhiều gói/phần mở rộng được phát triển bởi hàng ngàn nhà phát triển trên khắp thế giới. Phần mở rộng flask-restful, mà chúng ta sẽ khám phá trong bài đăng trên blog này, là một ví dụ điển hình về hệ sinh thái phong phú xung quanh Flask. Các phần mở rộng này cung cấp các tính năng và công cụ bổ sung giúp hợp lý hóa việc phát triển API và làm cho nó hiệu quả hơn.
2.3 Làm thế nào để tạo một API REST?
Việc triển khai API RESTFUL liên quan đến việc tuân thủ các nguyên tắc và thực tiễn tốt nhất nhất định. REST (Truyền trạng thái biểu diễn) là một kiểu kiến trúc nhấn mạnh một mô hình giao tiếp máy khách-máy chủ không trạng thái. Dưới đây là một số hướng dẫn cần tuân theo khi tạo API RESTFUL bằng flask-restful:
1. Thiết kế hướng tài nguyên: Xác định các tài nguyên mà API của bạn sẽ hiển thị và thiết kế các điểm cuối của bạn xung quanh chúng. Mỗi tài nguyên phải có một URI (Định danh tài nguyên thống nhất) duy nhất đại diện cho vị trí của nó trong API.
2. Sử dụng động từ HTTP: Tận dụng các động từ HTTP thích hợp (GET, POST, PUT, DELETE, v.v.) để thực hiện các hành động cụ thể trên tài nguyên của bạn. Ví dụ: sử dụng GET để truy xuất dữ liệu, POST để tạo tài nguyên mới, PUT để cập nhật tài nguyên hiện có và DELETE để xóa tài nguyên.
3. Cấu trúc URI: Thiết kế cấu trúc URI của bạn có tính phân cấp và có ý nghĩa. Sử dụng các đường dẫn con để thể hiện các mối quan hệ giữa các tài nguyên và đảm bảo tính nhất quán trong các quy ước đặt tên của bạn.
4. Mã trạng thái: Sử dụng mã trạng thái HTTP để truyền đạt kết quả của các yêu cầu API. Xử lý và trả về đúng các mã trạng thái có liên quan như 200 (OK), 201 (Đã tạo), 400 (Yêu cầu không hợp lệ), 404 (Không tìm thấy), v.v.
5. Định dạng yêu cầu và phản hồi: Xác định các định dạng để gửi và nhận dữ liệu trong API của bạn. JSON (Ký hiệu đối tượng JavaScript) là một định dạng phổ biến và được hỗ trợ rộng rãi cho API RESTFUL do tính đơn giản và dễ sử dụng của nó.
flask-restful đơn giản hóa việc triển khai các quy ước RESTFUL này bằng cách cung cấp các trình trang trí và phương thức phù hợp với các nguyên tắc được đề cập ở trên. Nó xử lý định tuyến, phân tích cú pháp yêu cầu và định dạng phản hồi, cho phép bạn tập trung vào logic của API của mình.
2.4 Làm thế nào để tạo một API trong Python JSON?
Khi xây dựng API flask-restful trong Python, việc xử lý dữ liệu JSON là một yêu cầu phổ biến. flask-restful cung cấp chức năng tích hợp để phân tích các yêu cầu JSON và tạo phản hồi JSON. Đây là cách bạn có thể xử lý dữ liệu JSON trong API flask-restful:
1. Phân tích yêu cầu JSON
Sử dụng phương thức `request.get_json()` do Flask cung cấp để trích xuất dữ liệu JSON từ các yêu cầu đến. Phương thức này tự động phân tích cú pháp nội dung yêu cầu và trả về một từ điển Python chứa dữ liệu JSON. Ví dụ:
from flask import request
class MyResource(Resource):
def post(self):
data = request.get_json()
return {'message': 'JSON data received'}
2. Xác thực yêu cầu JSON
Sau khi phân tích dữ liệu JSON, bạn có thể thực hiện xác thực để đảm bảo rằng dữ liệu nhận được đáp ứng các tiêu chí bắt buộc. flask-restful cho phép bạn sử dụng các thư viện bổ sung, chẳng hạn như Flask-Inputs hoặc Cerberus, để xác thực các yêu cầu JSON. Các thư viện này cung cấp các cơ chế để xác định các quy tắc xác thực và xử lý các lỗi xác thực.
3. Tạo phản hồi JSON
flask-restful tự động chuyển đổi các từ điển Python sang định dạng JSON khi trả về phản hồi. Chỉ cần trả về một từ điển từ các phương thức tài nguyên của bạn và flask-restful sẽ xử lý việc chuyển đổi. Ví dụ:
class MyResource(Resource):
def get(self):
data = {'name': 'John Doe', 'age': 30}
return data
Bằng cách tận dụng các khả năng xử lý JSON của flask-restful, bạn có thể dễ dàng xử lý dữ liệu JSON trong API Python của mình và đảm bảo giao tiếp liền mạch với khách hàng.
3. Tìm hiểu về flask-restful và những lợi ích của nó
flask-restful là một phần mở rộng cho Flask, đơn giản hóa việc phát triển API RESTFUL. Nó cung cấp một bộ công cụ và trình trang trí giúp hợp lý hóa việc tạo API, giúp quy trình hiệu quả và dễ quản lý hơn. Hãy cùng khám phá các tính năng và lợi ích của việc sử dụng flask-restful để phát triển API
3.1 Định tuyến đơn giản hóa
Việc định tuyến các điểm cuối API bằng cách sử dụng định tuyến dựa trên tài nguyên rất dễ thiết lập. Thay vì tự định nghĩa các tuyến cho từng điểm cuối, bạn xác định các tài nguyên tương ứng với các thực thể khác nhau trong API của bạn. flask-restful tự động ánh xạ các phương thức HTTP (GET, POST, PUT, DELETE) tới các phương thức tài nguyên thích hợp, giảm lượng mã lặp đi lặp lại cần thiết. Điều này tương tự như gói Django-Rest-Framework (đối với framework Django)
3.2 Phân tích cú pháp yêu cầu
Khả năng phân tích cú pháp yêu cầu tích hợp cho phép dễ dàng truy cập và xác thực dữ liệu yêu cầu. Chúng ta có thể xác định các tham số yêu cầu dự kiến, thực thi các kiểu dữ liệu và xử lý các lỗi xác thực bằng cách sử dụng các trình trang trí flask-restful, đảm bảo rằng API của bạn nhận được định dạng dữ liệu chính xác.
3.3 Xử lý lỗi
Các cơ chế xử lý lỗi tích hợp được đơn giản hóa. Nó tự động tạo ra các mã trạng thái HTTP và thông báo lỗi thích hợp cho các tình huống phổ biến, chẳng hạn như yêu cầu không hợp lệ hoặc không tìm thấy tài nguyên. Ngoài ra, bạn có thể tùy chỉnh việc xử lý lỗi để đáp ứng các yêu cầu cụ thể của mình.
3.4 Thương lượng nội dung
API thường cần hỗ trợ nhiều định dạng dữ liệu. flask-restful xử lý thương lượng nội dung, cho phép bạn dễ dàng phản hồi với các định dạng dữ liệu khác nhau dựa trên yêu cầu của khách hàng. Bằng cách chỉ định định dạng phản hồi dự kiến, flask-restful sẽ đảm nhận việc chuyển đổi dữ liệu thành định dạng được yêu cầu, chẳng hạn như JSON hoặc XML.
3.5 Nhập và xuất dữ liệu
flask-restful cung cấp khả năng nhập và xuất dữ liệu, giúp chuyển đổi các cấu trúc dữ liệu phức tạp thành các biểu diễn đơn giản hơn. Tính năng này cho phép bạn xác định lược đồ cho dữ liệu đầu vào và đầu ra, giúp bạn dễ dàng làm việc với các đối tượng phức tạp và đảm bảo tính nhất quán trong các phản hồi API.
3.6 Xác thực và ủy quyền
Bảo mật API của bạn là rất quan trọng và flask-restful cung cấp các cơ chế để xử lý xác thực và ủy quyền. Bạn có thể tích hợp các lược đồ xác thực, chẳng hạn như Mã thông báo web JSON (JWT) hoặc OAuth, để bảo vệ các điểm cuối API của bạn và kiểm soát quyền truy cập vào các tài nguyên cụ thể.
3.7 Tích hợp hệ sinh thái Flask
flask-restful tích hợp liền mạch với hệ sinh thái Flask rộng hơn, cho phép bạn tận dụng các phần mở rộng và thư viện Flask khác. Bạn có thể kết hợp flask-restful với Flask-SQLAlchemy để tích hợp cơ sở dữ liệu, Flask-JWT để xác thực dựa trên mã thông báo hoặc Flask-Cache để lưu trữ phản hồi, trong số nhiều khả năng khác. Việc tích hợp này mở rộng các khả năng của API của bạn và cho phép bạn xây dựng các ứng dụng phức tạp hơn.
4. Cách sử dụng flask-restful - một ví dụ hoàn chỉnh
Bạn có thể tìm thấy thêm chi tiết trong đây và đoạn mã bên dưới là một ứng dụng todo đơn giản hoàn chỉnh với API RESTFUL bằng Flask-RESTFUL
from flask import Flask, request
from flask_restful import Api, Resource, fields, marshal_with
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) # init the app
api = Api(app) # init the api
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todos.db' # setup the database url
db = SQLAlchemy(app) # init the database connection and database instance
# Todo Model class
class TodoModel(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
completed = db.Column(db.Boolean, default=False)
# Resource fields definition
resource_fields = {
'id': fields.Integer,
'title': fields.String,
'completed': fields.Boolean
}
# Todo Detail Resource Class to represent a Todo object in the response
class TodoResource(Resource):
# Get resouroce detail
@marshal_with(resource_fields)
def get(self, todo_id):
todo = TodoModel.query.get(todo_id)
if not todo:
return {'message': 'Todo not found'}, 404
return todo
# Delete resource
def delete(self, todo_id):
todo = TodoModel.query.get(todo_id)
if not todo:
return {'message': 'Todo not found'}, 404
db.session.delete(todo)
db.session.commit()
return {'message': 'Todo deleted'}
# Update resource
@marshal_with(resource_fields)
def put(self, todo_id):
todo = TodoModel.query.get(todo_id)
if not todo:
return {'message': 'Todo not found'}, 404
data = request.get_json()
todo.title = data['title']
todo.completed = data['completed']
db.session.commit()
return todo
# Todo List Resource Class to represent a list of Todo objects in the response
class TodoListResource(Resource):
# Get all todo resources
@marshal_with(resource_fields)
def get(self):
todos = TodoModel.query.all()
return todos
# Create a todo resource
@marshal_with(resource_fields)
def post(self):
data = request.get_json()
todo = TodoModel(title=data['title'], completed=data['completed'])
db.session.add(todo)
db.session.commit()
return todo, 201
api.add_resource(TodoListResource, '/todos') # Register path for LIST API (GET LIST, CREATE)
api.add_resource(TodoResource, '/todos/') # Register path for DETAIL API (GET DETAIL, DELETE, UPDATE) if __name__ == '__main__':
db.create_all()
app.run(debug=True)
Kết luận
Fask-restful, với bộ tính năng phong phú và khả năng tích hợp dễ dàng với Flask, trao quyền cho các nhà phát triển triển khai API RESTFUL một cách hiệu quả, dễ dàng và có thể mở rộng. Cho dù bạn là người mới bắt đầu hay một nhà phát triển có kinh nghiệm, flask-restful là một lựa chọn mạnh mẽ. Vì vậy, đừng ngần ngại tìm hiểu sâu về flask-restful và mở khóa toàn bộ tiềm năng của việc phát triển API RESTFUL trong Flask.
Tham khảo
- https://code.tutsplus.com/tutorials/building-restful-apis-with-flask-diy--cms-26625
- https://auth0.com/blog/developing-restful-apis-with-python-and-flask/
- https://www.analyticsvidhya.com/blog/2022/01/rest-api-with-python-and-flask/
- https://towardsdatascience.com/creating-restful-apis-using-flask-and-python-655bad51b24
- https://realpython.com/flask-connexion-rest-api/