Hello World! - Làm quen với Flask-RESTful
Last updated
Last updated
Đoạn mã nguồn tạo một ứng dụng RESTful đơn giản với địa chỉ /
để trả về một đối tượng JSON có với key là hello
và value là world
.
Đoạn mã nguồn bắt đầu bằng câu lệnh from flask import Flask
, để import thư viện Flask.
Tiếp theo, câu lệnh from flask_restful import Resource, Api
để import thư viện Flask-RESTful, để tạo ra một ứng dụng web RESTful.
Câu lệnh app = Flask(__name__)
tạo một đối tượng ứng dụng Flask, với tên ứng dụng là __name__
, để chỉ định tên ứng dụng.
Câu lệnh api = Api(app)
tạo một đối tượng API, với ứng dụng Flask là app
.
Class HelloWorld
được định nghĩa bên trong api
và kế thừa từ Resource
. Phương thức get
trong class HelloWorld
sẽ được gọi khi có yêu cầu GET
đến địa chỉ /
(địa chỉ Web cấp Root). Phương thức get
này trả về một đối tượng JSON có key là hello
và value là world
.
Câu lệnh api.add_resource(HelloWorld, '/')
thêm class HelloWorld
vào API, với địa chỉ /
(địa chỉ Web cấp Root).
Cuối cùng, câu lệnh if __name__ == '__main__':
chỉ định rằng đây là một ứng dụng chính, và sẽ được thực thi khi ứng dụng được khởi chạy. Câu lệnh app.run(debug=True)
chạy ứng dụng với môi trường debug. Cần lưu ý rằng tính năng debug chỉ nên kích hoạt trong quá trình lập trình, và nên tắt trong quá trình triển khai sử dụng thực tế.
Tương tác với API bằng cách thực thi đoạn mã $ curl http://127.0.0.1:5000/
trong một cửa sổ CMD hoặc Terminal mới, kết quả trả về là một đối tượng JSON.
Đoạn chương trình bên dưới định nghĩa một lớp SimpleTodo
, bao gồm hai phương thức là get
và put
. Trong đó, phương thức get sẽ truy xuất dữ liệu trong danh sách todos
(cấu trúc dữ liệu dict
) theo khóa (key) là todo_id
. Phương thức put sẽ thực hiện lấy dữ liệu từ request.form['data']
và ghi vào danh sách todos
.
Đoạn chương trình trên có thể được tương tác thông qua các câu lệnh sau trên môi trường CMD hoặc Terminal.
Với mỗi lệnh thực thi ở trên, hãy xem những kết quả trả về tương ứng trong cửa sổ CMD hoặc Terminal khởi chạy chương trình, và để ý phương thức HTTP ở dòng 1 và 2 dưới đây.
Để xem được giá trị "custom headers", như trình bày trong lớp Todo3
, chúng ta có thể sử dụng phần mềm Postman, kết quả được thể hiện như trong hình bên dưới.
Flask-RESRful cho phép lập trình khai báo nhiều Endpoints cho cùng một tài nguyên (resource). Cụ thể, lập trình viên chỉ cần truyền thêm các URL vào phương thức add_resource()
của đối tượng Api
.
Trong đoạn mã trên, được mở rộng từ chương trình minh họa, chúng ta thấy ưu điểm quan trọng của việc khai báo nhiều Endpoint cho cùng một Resource. Cụ thể, trong trường hợp yêu cầu (request) không bao gồm tham số <string:todo_id>
, thì chương trình sẽ sử dụng Endpoint tiếp theo, /todo/
trong tình huống này.
Flask-RESTful được bao gồm sẵn cơ chế hỗ trợ lập trình xử lý tham số đầu vào (argument parsing) cho các API Endpoint.
Khi sử dụng module reqparse
của Flask-RESTful, trình biên dịch sẽ trả về mã lỗi dựa trên bộ mã trạng thái HTTP và được biểu diễn theo định dạng JSON.
Bên cạnh hỗ trợ thao tác trên các cấu trúc dữ liệu của Python, Flask-RESTful hỗ trợ thao tác trên kiểu dữ liệu đối tượng, thông qua module fields
và decorator (tạm dịch: tiền chỉ thị) marshal_with()
.
Trong đoạn chương trình trên, decorator marshal_with()
sẽ áp dụng quá trình biến đổi được mô tả bởi resource_fields
. Trong đó, chỉ có thuộc tính task
được trích xuất từ đối tượng ban đầu, còn thuộc tính todo_id
bị bỏ qua, theo như định nghĩa trong resource_fields
. Trường fields.Url
là một trường đặc biệt nhận đầu vào là tên của Endpoint và tạo ra một URL tương ứng trong phản hồi.
Trong phần này, bài hướng dẫn sẽ giới thiệu một chương trình hoàn chỉnh được lập trình trên Flask-RESTful. Đoạn chương trình được lưu trong tập tin có tên api.py.
Đầu tiên, import
các module cần thiết từ Flask và Flask-RESTful.
Tiếp theo, khởi tạo một ứng dụng Flask và một API từ Flask-RESTful.
Tạo ra một danh sách TODOS chứa các công việc có sẵn, mỗi công việc có một ID duy nhất.
Lớp Todo
:
get
: Trả về thông tin của một công việc cụ thể dựa trên todo_id
.
delete
: Xoá một công việc dựa trên todo_id
.
put
: Cập nhật hoặc tạo mới một công việc dựa trên todo_id
.
TodoList
class:
get
: Trả về danh sách các công việc hiện có.
post
: Tạo mới một công việc và thêm vào danh sách.
Để tương tác với đoạn chương trình trên, trước hết khởi chạy chương trình bằng lệnh $ python api.py
, sau đó, hãy thực thi các lệnh sau cho từng trường hợp:
GET danh sách TODOS
GET một công việc (task)
DELETE một công việc (task)
Thêm một công việc (task) mới
Cập nhật nội dung một công việc (task)
Trong bài hướng dẫn này, chúng ta đã lần lượt trình bày qua những kiến thức chính và cơ bản của Flask-RESTful, gồm:
Định tuyến tài nguyên
Endpoints
Xử lý tham số đầu vào (Argument parsing)
Định dạng dữ liệu
Sau cùng, chúng ta cùng thực hành một tình huống ứng dụng - Lập trình các API cho ứng dụng quản lý công việc - để thao tác và hiểu rõ hơn cách hoạt động của Flask-RESTful, cũng như hoàn tất một chương trình "Hello World!".
Giải thích đoạn chương trình:
Để thực thi đoạn chương trình trên, trước hết, cần lưu lại thành tập tin và đặt tên api.py, sau đó thực thi lệnh $ python api.py
trong môi trường CMD hoặc Terminal. Lưu ý, cần kích hoạt trước khi thực thi lệnh trên.
Trong đoạn chương trình Python trên, chúng ta thấy rằng API của lớp HelloWorld
có thể được truy cập từ vị trí /
(địa chỉ Web cấp Root). Trong phần này, bài hướng dẫn sẽ trình bày cách định tuyến ở mức chi tiết hơn, cũng như cách khai thác các như GET, PUT.
Để hiểu thêm về cấu trúc dữ liệu dict
trong Python, bạn đọc có thể sử dụng gợi ý sau để tương tác với .
Flask-RESTful còn cho phép phản hồi (response) một cách tường minh các , chẳng hạn, 200 OK
hay 201 Created
.
Trong bài hướng dẫn này, cũng như trong lĩnh vực lập trình Microservices, thuật ngữ Endpoint thường được sử dụng nguyên mẫu tiếng Anh. Để hiểu về khái niệm này, sẽ trình bày bằng cả tiếng Việt và tiếng Anh.
Trong kiến trúc Microservices, Endpoint là gì?
What is Endpoint in Microservices?
Đoạn mã parser.parse_args()
sẽ trả về một đối tượng chứa các đối số được truyền vào trong mỗi request
. Trong trường hợp này, nó sẽ trả về một đối tượng chứa đối số rate
được truyền vào trong request
và có kiểu dữ liệu là số nguyên (int
).
Bạn đọc có thể tương tác với bằng cách sử dụng và cải thiện đoạn gợi ý (prompt) sau:
Decorator "marshal_with()" thường được sử dụng trong các framework như Flask-RESTful để định dạng dữ liệu trước khi trả về từ một API endpoint. Decorator này thường được áp dụng cho các hàm để xử lý việc chuyển đổi dữ liệu thành định dạng mong muốn trước khi gửi về cho người dùng hoặc ứng dụng khác.
Trong lĩnh vực lập trình, DAO (Data Access Object) là một mô hình thiết kế được sử dụng để tách biệt việc truy cập vào dữ liệu từ logic của ứng dụng. Đây là một thành phần hoặc lớp có nhiệm vụ cung cấp các phương thức để thực hiện các hoạt động truy vấn và cập nhật dữ liệu trong cơ sở dữ liệu. DAO giúp tăng tính mô đun, dễ bảo trì và mở rộng của ứng dụng bằng cách cung cấp một cách tiếp cận logic và cơ sở dữ liệu một cách riêng biệt và linh hoạt.
Chương trình trên sử dụng Flask-RESTful để tạo một API cho việc quản lý các công việc (todos). Đây là một ví dụ cơ bản về cách tạo các endpoint để thực hiện các thao tác CRUD (Create, Read, Update, Delete) trên danh sách các công việc.
Tiếp theo, chương trình định nghĩa hai lớp là Todo
và TodoList
kế thừa từ lớp Resource
của Flask-RESTful:
Sau cùng, thiết lập các route (định tuyến) cho hai lớp TodoList
và Todo
thông qua api.add_resource()
để gán các đường dẫn URL cho từng tài nguyên (resource) tương ứng.