今天,我们要提升技能,构建一些真实的东西——你自己的第一个使用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 端点 🧪
打开您的浏览器并访问:
- http://localhost:5000/ → 查看欢迎信息
- http://localhost:5000/api/books → 查看所有书籍
- http://localhost:5000/api/books/1 → 查看第一本书
或者使用像 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请求,您需要使用像 Postman 或 curl 这样的工具。
使用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/