下面是完整的攻略:
一、背景介绍
Flask-RESTful 是 Flask 的拓展插件,它通过继承 Flask 的核心类来构建 RESTful API 接口,同时对 Flask 应用进行了一些功能上的增强和语法上的简化,开发者可以通过继承 Flask-RESTful 内置的 Resource 类来实现具体的 API 接口。
二、安装 Flask-RESTful
在安装 Flask-RESTful 之前,需要先安装 Flask。可以使用如下命令:
pip install flask
安装完成后,安装 Flask-RESTful:
pip install flask-restful
三、构建API接口
- 导入必要的库。
from flask import Flask
from flask_restful import Resource, Api
- 创建Flask应用实例。
app = Flask(__name__)
- 创建RESTful Api实例。
api = Api(app)
- 基于 Flask-RESTful 内置的 Resource 类创建具体的 API 接口,需要重写 get、post、delete、put 等方法来对应于 HTTP 请求。
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
上面的示例中,我们创建了一个 HelloWorld 类,继承自 Flask-RESTful 内置的 Resource 类,其中 get() 方法用于处理 GET 请求,返回一个字典。这个字典将自动转换成 JSON 格式并返回给客户端。
- 添加API路由,指向具体的 API 接口。
api.add_resource(HelloWorld, '/hello')
在上述代码中,我们指定了 /hello 路由,将其映射到 HelloWorld 类中处理 GET 请求的方法。
完成以上步骤后,可以创建 Flask 应用,并通过调用 run() 方法来启动服务器:
app.run(debug=True)
四、示例说明
下面是两个简单的示例说明,来演示 Flask-RESTful 如何构建API接口。
示例一:实现两数相加的API接口
from flask import Flask
from flask_restful import Resource, Api, reqparse
app = Flask(__name__)
api = Api(app)
class Add(Resource):
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('num1', type=float, help='num1 is required', required=True)
parser.add_argument('num2', type=float, help='num2 is required', required=True)
args = parser.parse_args()
result = args['num1'] + args['num2']
return {'result': result}
api.add_resource(Add, '/add')
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,我们实现了一个两数相加的 API 接口,使用 Flask-RESTful 内置的 reqparse 类来解析 POST 请求中的参数,最终返回相加后的结果。
示例二:实现图书管理的API接口
from flask import Flask
from flask_restful import Resource, Api, reqparse, fields, marshal_with, marshal
app = Flask(__name__)
api = Api(app)
books = []
book_fields = {
'id': fields.Integer,
'title': fields.String,
'author': fields.String,
'year': fields.Integer,
}
class Book(Resource):
def get(self, book_id):
book = next(filter(lambda x: x['id'] == book_id, books), None)
if book:
return marshal(book, book_fields)
else:
return {'message': 'Book not found'}, 404
def delete(self, book_id):
global books
books = list(filter(lambda x: x['id'] != book_id, books))
return {'message': 'Book deleted successfully'}
class BookList(Resource):
@marshal_with(book_fields)
def get(self):
return books
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('title', type=str, help='Title is required', required=True)
parser.add_argument('author', type=str, help='Author is required', required=True)
parser.add_argument('year', type=int, help='Year is required', required=True)
args = parser.parse_args()
book_id = len(books) + 1
book = {'id': book_id, 'title': args['title'], 'author': args['author'], 'year': args['year']}
books.append(book)
return {'message': 'Book added successfully', 'data': book}, 201
api.add_resource(BookList, '/books')
api.add_resource(Book, '/books/<int:book_id>')
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,我们实现了一个简单的图书管理 API 接口。使用 Flask-RESTful 内置的 fields 类来定义输出的字段,使用 marshal_with 装饰器来返回指定字段的数据,使用 marshal 函数来处理单个数据的输出。同时,我们也对 GET 和 DELETE 请求采用了常见的过滤器技巧,对列表数据进行了删除和查询等操作。