Python中Flask-RESTful编写API接口(小白入门)

  • Post category:Python

下面是完整的攻略:

一、背景介绍

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接口

  1. 导入必要的库。
from flask import Flask
from flask_restful import Resource, Api
  1. 创建Flask应用实例。
app = Flask(__name__)
  1. 创建RESTful Api实例。
api = Api(app)
  1. 基于 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 格式并返回给客户端。

  1. 添加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 请求采用了常见的过滤器技巧,对列表数据进行了删除和查询等操作。