1. Cài đặt thư viện
Cài đặt Flask-RESTful thông qua pip:
pip install flask-restful
2. Cách sử dụng cơ bản
Dưới đây là ví dụ đơn giản về cách xây dựng API RESTful:
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
# Tạo API instance
api_instance = Api(app)
class SampleResource(Resource):
def get(self):
return {'method': 'GET'}
def put(self):
return {'method': 'PUT'}
def post(self):
return {'method': 'POST'}
# Đăng ký tài nguyên với đường dẫn
api_instance.add_resource(SampleResource, '/sample')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000, debug=True)
3. Sử dụng với Blueprint
Khi cần tổ chức mã nguồn theo module, có thể kết hợp với Blueprint:
from flask import Flask, Blueprint
from flask_restful import Api, Resource
user_bp = Blueprint('users', __name__)
main_app = Flask(__name__)
api_handler = Api(user_bp)
class UserResource(Resource):
def get(self):
return {'method': 'GET'}
def put(self):
return {'method': 'PUT'}
def post(self):
return {'method': 'POST'}
api_handler.add_resource(UserResource, '/profile')
# Gán blueprint vào ứng dụng chính
main_app.register_blueprint(user_bp, url_prefix='/api/v1')
if __name__ == '__main__':
main_app.run(host='0.0.0.0', port=9000, debug=True)
Lưu ý: Khi dùng Blueprint có url_prefix, đường dẫn thực tế sẽ là: prefix + resource_path.
4. Xử lý tham số yêu cầu
4.1. Lớp RequestParser
Flask-RESTful cung cấp lớp RequestParser để xác thực và chuyển đổi dữ liệu đầu vào:
from flask_restful import reqparse
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('parameter_x', required=True, location='args')
validated_data = parser.parse_args()
param_value = validated_data.parameter_x
return {'received': param_value}
4.2. Các thuộc tính của tham số
required
True: Bắt buộc phải có tham số nàyFalse: Không bắt buộc, giá trị mặc định là None nếu không có
help
Thông báo lỗi khi xác thực thất bại.
action
'store': Giữ giá trị đầu tiên (mặc định)'append': Lưu tất cả giá trị dưới dạng danh sách
choices
Giới hạn các giá trị được chấp nhận:
parser.add_argument('gender', type=str, choices=['male', 'female'], location='args')
type
Xác định kiểu dữ liệu:
# Kiểu chuẩn Python
parser.add_argument('number_field', type=int, required=True, location='args')
# Kiểu từ flask_restful.inputs
from flask_restful import inputs
parser.add_argument('pattern_field', type=inputs.regex(r'^\d{3}$'), location='args')
parser.add_argument('range_field', type=inputs.int_range(1, 10), location='args')
parser.add_argument('bool_field', type=inputs.boolean, location='args')
location
Xác định nơi lấy dữ liệu:
# Từ form data
parser.add_argument('form_data', location='form')
# Từ query string
parser.add_argument('query_param', location='args')
# Từ header
parser.add_argument('header_value', location='headers')
# Từ cookie
parser.add_argument('cookie_value', location='cookies')
# Từ JSON body
parser.add_argument('json_field', location='json')
# Từ file upload
parser.add_argument('file_data', location='files')
# Từ nhiều nguồn
parser.add_argument('multi_source', location=['args', 'json'])
4.3. Ví dụ hoàn chỉnh
from flask import Flask
from flask_restful import Api, Resource, reqparse, inputs
app = Flask(__name__)
api = Api(app)
class DataProcessor(Resource):
def post(self):
validator = reqparse.RequestParser()
validator.add_argument(
'id',
type=int,
required=True,
help='ID là bắt buộc và phải là số',
location='args'
)
validator.add_argument(
'name',
type=str,
required=True,
action='append',
location='args'
)
validator.add_argument(
'category',
type=str,
choices=['A', 'B', 'C'],
action='append',
location='args'
)
validator.add_argument(
'code',
type=inputs.regex(r'^\d{4}$'),
location='args'
)
validator.add_argument(
'count',
type=inputs.int_range(1, 50),
location='args'
)
validator.add_argument(
'active',
type=inputs.boolean,
location='args'
)
data = validator.parse_args()
return {
'id': data.id,
'names': data.name,
'categories': data.category,
'code': data.code,
'count': data.count,
'active': data.active
}
api.add_resource(DataProcessor, '/process')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000, debug=True)