如何在Ubuntu上使用Flask创建REST API

简介

在本教程中,您将学习如何使用Flask这个轻量级的Python网络框架来创建一个简单的REST API。我们将涵盖设置Flask应用程序的基本知识,定义路由,处理请求以及返回JSON响应。通过本教程的学习,您将拥有一个可以扩展并与其他应用程序集成的运行中API。

先决条件

  • 运行Ubuntu的服务器和一个具有sudo权限的非root用户以及一个活动的防火墙。如果您需要设置此环境的指导,请从这个列表中选择您的发行版,并遵循我们的初始服务器设置指南。请确保使用支持的Ubuntu版本
  • 熟悉Linux命令行。如果您需要了解或复习命令行,可以查看这个关于Linux命令行入门的指南。

  • 对Python编程有基本了解。

  • 您的Ubuntu系统上安装了Python 3.7或更高版本。要了解如何在Ubuntu上运行Python脚本,请参考我们关于如何在Ubuntu上运行Python脚本的教程。

第一步 — 设置Flask环境

Ubuntu 24.04默认包含Python 3。打开终端并运行以下命令以确认Python 3的安装情况:

root@ubuntu:~# python3 --version
Python 3.12.3

如果您的计算机上已经安装了Python 3,上述命令将返回Python 3的当前版本。如果尚未安装,您可以运行以下命令获取Python 3的安装:

root@ubuntu:~# sudo apt install python3

接下来,您需要在系统中安装pip包安装器:

root@ubuntu:~# sudo apt install python3-pip

一旦安装了pip,让我们安装Flask。

您将通过pip安装Flask。建议在虚拟环境中进行此操作,以避免与系统上其他包的冲突。

root@ubuntu:~# python3 -m venv myprojectenv
root@ubuntu:~# source myprojectenv/bin/activate
root@ubuntu:~# pip install Flask

步骤2 – 创建Flask应用程序

下一步是编写Flask应用程序的Python代码。要创建一个新的脚本,请导航到您选择的目录:

root@ubuntu:~# cd ~/path-to-your-script-directory

在目录内部,创建一个新的Python文件,命名为app.py,并导入Flask。然后,初始化一个Flask应用程序并创建一个基本的路由。

root@ubuntu:~# nano app.py

这将打开一个空白文本编辑器。在这里编写您的逻辑,或者复制以下代码:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# 内存中的数据存储
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

步骤3 – 创建RESTful路由

在本节中,我们将定义Flask应用程序中对应于用户可以对API执行的不同操作的路由。每个路由将处理特定的HTTP方法。

GET, POST, PUT, 和 DELETE。这些方法对应于持久存储的四个基本操作——通常被称为CRUD(创建,读取,更新,删除)。

将以下路由添加到您的 app.py python 脚本中:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# 内存中的数据存储
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

# GET 请求:检索所有项
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

# GET 请求:通过ID检索特定项
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

# POST 请求:创建新项
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

# PUT 请求:更新现有项
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

# DELETE 请求:删除项
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

if __name__ == "__main__":
    app.run(debug=True)

让我们了解每个函数的作用:

  • Flask 导入:代码从Flask中导入必要的组件: Flaskjsonifyrequest

  • 内存中的数据存储items 是一个字典列表,作为 API 的临时数据存储。每个项都有一个 id 和一个 name

  • 当向/api/items发出GET请求时,服务器返回项目数据存储中所有项目的列表。这对于检索集合中的所有资源很有用。

  • POST /api/items: 向/api/items发出POST请求允许客户端创建一个新项目。服务器期望在请求体中包含新项目的详细信息的JSON对象。在创建项目后,服务器用新创建的项目和201 Created状态码响应。

  • PUT /api/items/<int:item_id>: 对/api/items/<item_id>发出PUT请求用于更新具有指定item_id的现有项目。客户端在请求体中发送更新后的数据,服务器修改现有项目。如果找不到项目,服务器返回404 Not Found错误。

  • DELETE /api/items/: 对/api/items/DELETE请求从数据存储中删除具有指定item_id的项目。如果成功删除项目,服务器以204 No Content状态码响应,表示删除成功且没有更多内容可返回。

  • 运行应用程序: if __name__ == "__main__": 确保当直接执行脚本时Flask应用程序运行。

步骤4 — 运行和测试您的API

使用以下命令启动Flask服务器:

root@ubuntu:~# python3 app.py

您应该会看到Flask服务器正在运行,输出如下:

Output
* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 837-877-972

从上述输出中,您可以注意到服务器正在http://127.0.0.1上运行,监听端口5000

现在,您可以使用curl,Postman或其他HTTP客户端来测试端点。在本教程中,您将使用curl来测试端点和发送HTTP请求。

打开另一个Ubuntu控制台,并依次执行下面的curl命令:

  • GET: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
  • PUT: curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
  • DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

让我们看看这些命令的具体执行情况:

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 1, "name": "This is item 1" }, { "id": 2, "name": "This is item 2" } ]

您将注意到服务器返回了items数据存储中所有项目的列表。

使用POST方法,让我们向数据存储中添加一个新项目。

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "这是一个项目3"}' http://127.0.0.1:5000/api/items
Output
{ "id": 3, "name": "This is item 3" }

注意:在您运行Flask服务器的另一个控制台上,您将注意到所有HTTP请求的执行和它们的响应代码。

* Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972
127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

这是监控、调试和服务器问题排除的好方法。

接下来,让我们执行一个PUT请求。向/api/items/<item_id>发送PUT请求将使用指定的item_id更新现有项目。

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "这是更新后的项目1"}' http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

现在,让我们执行一个GET请求以查看更新后的项目1。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

最后,让我们执行一个DELETE请求,从数据存储中删除一个项目。

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

这将删除数据存储中的项目1。

为了验证这一点,让我们执行一个GET请求。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 2, "name": "This is item 2" }, { "id": 3, "name": "This is item 3" } ]

您将注意到项目1已不再存在且已被永久删除。

结论

在本教程中,您使用Flask构建了一个基本的REST API应用程序。现在,您可以扩展此API以添加其他路由,集成数据库,或将其部署到像DigitalOcean这样的云平台。Flask是构建API快速且高效的强大工具,有了这些基础知识,您就准备好开始构建更复杂的应用程序了。

Source:
https://www.digitalocean.com/community/tutorials/create-a-rest-api-using-flask-on-ubuntu