当前位置 : 主页 > 编程语言 > python >

Flask-RESTful:使用Python构建RESTful API

来源:互联网 收集:自由互联 发布时间:2023-07-30
Flask-RESTful:使用Python构建RESTful API 随着现代互联网服务的崛起,RESTful API已成为通信协议的标准。为了开发高质量的RESTful API, Python有一个高效的框架, Flask-RESTful。本文将介绍什么是

Flask-RESTful:使用Python构建RESTful API

随着现代互联网服务的崛起,RESTful API已成为通信协议的标准。为了开发高质量的RESTful API, Python有一个高效的框架, Flask-RESTful。本文将介绍什么是Flask-RESTful以及如何使用Python构建RESTful API。

第一部分:了解RESTful API
REST(表述性状态转移)是基于HTTP协议的一种Web服务的架构风格,它允许客户端请求访问和获取资源,并允许服务端返回请求的资源。API(应用程序编程接口)则是程序和系统之间的通信协议,它允许不同的应用程序通过定义的接口相互通信,从而实现完成特定的任务。RESTful API由两部分组成:资源(URI)和行为(HTTP方法)。

资源是RESTful API的核心,即对内部数据的表述。 URI(统一资源标识符)指定了每个资源的位置,每个资源都有一个唯一的URI。另一方面,行为指定了如何访问和操作资源。 RESTful API使用HTTP方法来定义这些操作,例如,GET方法用于检索资源,POST方法用于创建资源,PUT方法用于更新资源,DELETE方法用于删除资源。

第二部分:介绍Flask-RESTful
Flask-RESTful是Flask的扩展模块,是一种Python的RESTful框架。它为构建RESTful API提供了简化的方法和工具。 Flask-RESTful的优点如下:

1、易于使用
Flask-RESTful是一个轻量级的框架,基于Flask框架。它提供了一组简单的工具,可以帮助开发人员快速构建 RESTful API,而不需要编写大量的重复代码。

2、快速开发
由于一些简化的方法,如请求参数解析和路由创建,可以显着减少API的开发时间。

3、对扩展和定制提供了支持
Flask-RESTful提供了灵活的扩展和自定义点,开发人员可以根据需要扩展其功能。

4、文档非常详细
Flask-RESTful的文档非常详细,易于学习和使用。

第三部分:如何使用Flask-RESTful
接下来,我们将介绍如何使用Flask-RESTful来构建RESTful API。我们将创建一个简单的API,用于管理电影数据。这个API将允许客户端进行以下操作:

1、列出所有电影
2、获取一个电影的详细信息
3、添加新电影
4、更新电影信息
5、删除电影记录

首先,安装及配置Flask-RESTful并创建Python虚拟环境。使用以下命令安装Flask-RESTful(确保已安装pip):

pip install flask-restful

接下来,创建一个app.py文件。该文件必须导入所需的模块和库。这个文件将定义并实现Flask应用程序。

from flask import Flask, request
from flask_restful import Resource, Api, reqparse

app = Flask(__name__)
api = Api(app)

此处我们引入了Flask和Flask-RESTful的库及模块。接下来,让我们定义一些虚拟数据。

movies = [
{ 'id': 1, 'title': 'The Shawshank Redemption', 'director': 'Frank Darabont', 'year_released': 1994},
{ 'id': 2, 'title': 'Forrest Gump', 'director': 'Robert Zemeckis', 'year_released': 1994},
{ 'id': 3, 'title': 'The Matrix', 'director': 'The Wachowski Brothers', 'year_released': 1999},
{ 'id': 4, 'title': 'Léon: The Professional', 'director': 'Luc Besson', 'year_released': 1994},
{ 'id': 5, 'title': 'The Dark Knight', 'director': 'Christopher Nolan', 'year_released': 2008},
{ 'id': 6, 'title': 'Interstellar', 'director': 'Christopher Nolan', 'year_released': 2014},
{ 'id': 7, 'title': 'Inception', 'director': 'Christopher Nolan', 'year_released': 2010},
{ 'id': 8, 'title': 'The Lord of the Rings: The Fellowship of the Ring', 'director': 'Peter Jackson', 'year_released': 2001},
{ 'id': 9, 'title': 'Gladiator', 'director': 'Ridley Scott', 'year_released': 2000},
{ 'id': 10, 'title': 'The Godfather', 'director': 'Francis Ford Coppola', 'year_released': 1972}
]

现在,创建5个不同的资源来处理5个不同的HTTP请求:GET,POST,PUT,DELETE。

class MovieList(Resource):
    def get(self):
        return { 'movies': movies }

    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('title', type=str, required=True, help='Title is required.')
        parser.add_argument('director', type=str, required=True, help='Director is required.')
        parser.add_argument('year_released', type=int, required=True, help='Year must be a number.')
        args = parser.parse_args()

        movie = {
        'id': len(movies) + 1,
        'title': args['title'],
        'director': args['director'],
        'year_released': args['year_released']
        }

        movies.append(movie)
        return movie, 201

class Movie(Resource):
    def get(self, movie_id):
        movie = next(filter(lambda x:x['id']==movie_id, movies), None)
        return {'movie': movie}, 200 if movie else 404

    def put(self, movie_id):
        parser = reqparse.RequestParser()
        parser.add_argument('title', type=str, required=True, help='Title is required.')
        parser.add_argument('director', type=str, required=True, help='Director is required.')
        parser.add_argument('year_released', type=int, required=True, help='Year must be a number.')
        args = parser.parse_args()

        movie = next(filter(lambda x:x['id']==movie_id, movies), None)
        if movie is None:
            movie = {'id': movie_id, 'title': args['title'], 'director': args['director'], 'year_released': args['year_released']}
            movies.append(movie)
        else:
            movie.update(args)
        return movie

    def delete(self, movie_id):
        global movies
        movies = list(filter(lambda x:x['id']!=movie_id, movies))
        return {'message': 'Movie deleted.'}, 200

这些资源被映射到与URL相关的路径中。

api.add_resource(MovieList, '/movies')
api.add_resource(Movie, '/movies/<int:movie_id>')

现在,启动Flask应用程序并检查本地主机( http://127.0.0.1:5000/movies ),我们可以看到刚刚创建的API列表:

{
"movies": [
    {
      "director": "Frank Darabont", 
      "id": 1, 
      "title": "The Shawshank Redemption", 
      "year_released": 1994
    },
    ...
  ]
}

现在,我们可以使用POST方法添加一个新电影。

import requests

url = 'http://localhost:5000/movies'
data = {"title": "The Green Mile", "director": "Frank Darabont", "year_released": "1999"}
res = requests.post(url, data=data)

完整的请求和响应如下所示:

<Response [201]>
{'id': 11, 'title': 'The Green Mile', 'director': 'Frank Darabont', 'year_released': 1999}

我们还可以使用PUT方法来更新电影信息。

url = 'http://localhost:5000/movies/11'
data = {"title": "The Green Mile", "director": "Frank Darabont", "year_released": "1999"}
res = requests.put(url, data=data)

最后,让我们删除一个电影。

url = 'http://localhost:5000/movies/11'
res = requests.delete(url)

我们创建了一个简单的RESTful API,使用Flask-RESTful框架使其易于开发和维护。RESTful API是开发网络应用程序的必不可少的组件,它允许客户端对资源进行访问和更新,并强调URI和HTTP方法。同时使用Flask-RESTful可以加快团队的开发速度并简化代码。

网友评论