初学者的Python:使用Flask构建您的第一个REST API

今天,我们要提升技能,构建一些真实的东西——你自己的第一个使用Flask的REST API。到最后,你将拥有一个在你电脑上运行的实际后端服务。让我们开始吧!

什么是REST API?🤔

把REST API想象成一个餐厅里的服务员

  • 客户端(比如你的React应用)是饥饿的顾客,他们下订单(发送请求)
  • 你的API接收这些订单,前往厨房(你的数据库/业务逻辑),然后带着食物(数据)回来

这只是不同应用程序通过互联网相互通信的一种方式。没什么可怕的!

为什么选择Flask?💡

Flask是Python的轻量级Web框架,它不会强迫你使用复杂的模式。它是:

  • 极简主义:没有你不需要的臃肿功能
  • 灵活:完全可以根据你的需求构建
  • 适合初学者:从小开始,逐步扩展

此外,像Netflix、LinkedIn和Uber这样的公司也在使用Flask来提供他们的一些服务。你选择的框架很不错!

设置您的环境 🛠️

首先,让我们为我们的项目创建一个专用空间:

# 创建项目文件夹
mkdir flask_api_project
cd flask_api_project

# 创建并激活虚拟环境
python -m venv venv

# 在 Windows 上
venv\Scripts\activate

# 在 macOS/Linux 上
source venv/bin/activate

# 安装 Flask
pip install flask

你的第一个 Flask API 🎉

创建一个名为 app.py 的文件,并添加以下代码:

from flask import Flask, jsonify

# 初始化 Flask 应用
app = Flask(__name__)

# 示例数据 - 想象这就是你的数据库
books = [

{id: 1, title: Python速成课程, author: 埃里克·马修斯},
{id: 2, title: 自动化无聊的工作, author: 阿尔·斯威加特},


{
  "id": 3,
  "title": "Fluent Python",
  "author": "Luciano Ramalho"
}

]

# 根路由
@app.route(‘/’)
def hello():
return jsonify({
“message”: “欢迎使用我们的书店API!”
})

# 获取所有书籍


@app.route('/api/books', methods=['GET'])
def get_books():
return jsonify({"books": books})

# 获取特定书籍
@app.route(‘/api/books/’, methods=[‘GET’])
def get_book(book_id):


book = next((book for book in books if book["id"] == book_id), None)
if book:
return jsonify({"book": book})
return jsonify({"message": "未找到书籍"}), 404

# 运行服务器
if __name__ == __main__:


html
app.run(debug=True)


让我们来分析一下发生了什么:

  • 我们导入 Flask 并创建我们的应用
  • 我们定义了一些示例数据(在实际应用中,这些数据将来自数据库)
  • 我们创建了三个“路由”(端点):
  • / → 返回欢迎信息
  • /api/books → 返回所有书籍
  • /api/books/<id> → 根据 ID 返回特定书籍

 

运行您的 API 🏃‍♀️

在您的终端中:

python app.py

你应该会看到类似以下内容:

 * 正在运行于 http://127.0.0.1:5000/ (按 CTRL+C 退出)
 * 正在使用 stat 重启
 * 调试器已激活!

恭喜!您的 API 正在运行!🎉 您做到了!

测试您的 API 端点 🧪

打开您的浏览器并访问:

或者使用像 Postman 这样的工具进行更高级的测试。

使其互动:POST、PUT、DELETE 🔄

让我们升级我们的 API,以允许创建、更新和删除书籍。更新您的 app.py


from flask import Flask, jsonify, request

# 初始化 Flask 应用
app = Flask(__name__)

# 示例数据
books = [
    {"id": 1, "title": "Python Crash Course", "author": "Eric Matthes"},

[
    {
        "id": 2,
        "title": "自动化无聊的事情",
        "author": "阿尔·斯威加特"
    },
    {
        "id": 3,
        "title": "流利的Python",
        "author": "卢西亚诺·拉马尔霍"
    }
]

# 根路由
@app.route(‘/’)


python
def hello():
return jsonify({message: 欢迎使用我们的书店API!})

# 获取所有书籍
@app.route(/api/books, methods=[GET])
def get_books():
return jsonify({books: books})

# 获取特定书籍

python
@app.route(‘/api/books/’, methods=[‘GET’])
def get_book(book_id):
book = next((book for book in books if book[“id”] == book_id), None)
if book:
return jsonify({“book”: book})
这段代码定义了一个API路由,用于获取特定书籍的信息。通过`@app.route`装饰器,指定了路由的路径和允许的HTTP方法。在`get_book`函数中,使用`next`函数从书籍列表中查找与给定`book_id`匹配的书籍。如果找到了对应的书籍,则返回该书籍的JSON格式数据。


return jsonify({"message": "未找到书籍"}), 404

# 创建一本新书
@app.route('/api/books', methods=['POST'])
def add_book():
    if not request.json or not 'title' in request.json or not 'author' in request.json:

return jsonify({"message": "请提供标题和作者"}), 400

    # 查找现有的最高 ID 并加 1
    new_id = max(book["id"] for book in books) + 1

    new_book = {
        "id": new_id,
        "title": request.json["title"],

作者: 请求.json[作者]
}
书籍.追加(新书)
返回 jsonify({书籍: 新书}), 201

# 更新一本书
@app.route(/api/books/<int:book_id>, 方法=[PUT])
定义 更新书籍(书籍_id):

book = next((book for book in books if book[id] == book_id), None)
if not book:
return jsonify({message: 未找到书籍}), 404


book["title"] = request.json.get("title", book["title"])
book["author"] = request.json.get("author", book["author"])
return jsonify({"book": book})

# 删除一本书

@app.route('/api/books/', methods=['DELETE'])
def delete_book(book_id):
    global books
    book = next((book for book in books if book["id"] == book_id), None)
    if not book:

return jsonify({"message": "未找到书籍"}), 404

    books = [book for book in books if book["id"] != book_id]
    return jsonify({"message": "书籍已删除"})

# 运行服务器
if __name__ == '__main__':

app.run(debug=True)

现在您的 API 可以:

  • GET /api/books → 读取所有书籍
  • GET /api/books/1 → 读取特定书籍
  • POST /api/books → 创建新书籍
  • PUT /api/books/1 → 更新书籍
  • DELETE /api/books/1 → 删除书籍

这完成了大多数 API 所需的 CRUD 操作(创建、读取、更新、删除)!

测试新端点 🧪

对于POST、PUT和DELETE请求,您需要使用像 Postmancurl 这样的工具。

使用curl的POST请求示例:

curl -X POST http://localhost:5000/api/books \
  -H "Content-Type: application/json" \
  -d '{"title": "Learn Python the Hard Way", "author": "Zed Shaw"}'

让你的API准备好投入生产 🚦

 

在实际场景中,你可能想要:

  • 连接数据库:用像SQLite、PostgreSQL或MongoDB这样的合适数据库替换我们的列表。
  • 添加认证:实现JWT令牌或API密钥。
  • 结构化你的代码:拆分成模块化文件(路由、模型等)。
  • 添加验证:确保数据格式正确。
  • 添加错误处理:提供更强大的错误信息。
  • 部署:在Heroku、AWS或DigitalOcean等平台上托管。

下一步 🚀

准备好提升技能了吗?尝试这些挑战:

  • 添加搜索功能:按标题或作者过滤书籍。
  • 添加分页:一次只返回10本书。
  • 添加评论:为书籍评论创建嵌套资源。
  • 连接数据库:使用Flask-SQLAlchemy从列表切换到SQLite。

 

结论 🎯

 

你做到了!你用Flask构建了你的第一个REST API。曾经看似复杂的后端魔法,现在是你理解并能自己构建的东西!

记住,这只是一个开始。RESTful API 是现代 web 应用程序的支柱,而你刚刚迈出了进入这个世界的第一步。继续实验,继续构建,最重要的是,享受这个过程

——

来QPY+学AI课程:https://www.qpython.com.cn/ai-courses/

更多