Sử dụng Flask-RESTful trong Flask

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ày
  • False: 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)

Thẻ: Flask flask-restful rest-api python-web api-development

Đăng vào ngày 4 tháng 6 lúc 00:44