Flask 速成 REST API:从虚拟环境到 CRUD 单元测试,一步不漏!

作者:API传播员 · 2025-11-08 · 阅读时间:6分钟

构建 REST API 是现代 Web 开发中的必备技能。Flask 作为一个轻量级的 Python Web 框架,非常适合快速构建和部署 API。本指南将带你逐步完成使用 Flask 构建 REST API 的全过程,包括环境设置、创建基本应用程序、构建 RESTful 端点以及测试 API 🚀。

💡 想让指标可衡量、团队节奏更透明?「开发任务管理系统 KPI」提示词可帮你基于 AI 超级提示词,快速制定与业务成果对齐的 KPI,兼顾用户参与度与交付质量!


一、设置开发环境 ⚙️

1.1 安装 Flask

pip install flask

1.2 创建虚拟环境(推荐)

# 创建
python -m venv venv

# 激活
## Windows
venv\Scripts\activate
## Linux/macOS
source venv/bin/activate

🛠️ 写完依赖别忘了跑「代码优化」提示词,一键诊断慢查询与重复请求,让接口响应提速 30 %!


二、创建基本 Flask 应用 🖥️

项目结构:

my_flask_api/
├── app.py
├── requirements.txt
└── venv/

最小可运行示例(app.py):

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Welcome to the Flask REST API!"

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

启动 & 浏览器访问:http://127.0.0.1:5000


三、构建 RESTful 端点 📡

3.1 数据模型(内存列表)

books = [
    {"id": 1, "title": "Book One", "author": "Author A", "published_date": "2021-01-01"},
    {"id": 2, "title": "Book Two", "author": "Author B", "published_date": "2022-02-02"}
]

3.2 CRUD 实现

方法 端点 功能
GET /books 获取全部
GET /books/<int:book_id> 获取单本
POST /books 新增
PUT /books/<int:book_id> 更新
DELETE /books/<int:book_id> 删除

代码片段:

from flask import request, jsonify

# 获取全部
@app.route('/books', methods=['GET'])
def get_books():
    return jsonify(books)

# 获取单本
@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = next((b for b in books if b["id"] == book_id), None)
    return jsonify(book) if book else ("Not Found", 404)

# 新增
@app.route('/books', methods=['POST'])
def add_book():
    new_book = request.get_json()
    new_book["id"] = max(b["id"] for b in books) + 1
    books.append(new_book)
    return jsonify(new_book), 201

# 更新
@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = next((b for b in books if b["id"] == book_id), None)
    if not book:
        return ("Not Found", 404)
    data = request.get_json()
    book.update(data)
    return jsonify(book)

# 删除
@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    global books
    books = [b for b in books if b["id"] != book_id]
    return ("", 204)

四、测试 API ✅

4.1 手动测试(cURL / Postman)

# 获取全部
curl http://127.0.0.1:5000/books

# 新增
curl -X POST -H "Content-Type: application/json" \
     -d '{"title":"Flask Handbook","author":"Your Name","published_date":"2025-06-01"}' \
     http://127.0.0.1:5000/books

4.2 单元测试(unittest)

test_app.py

import unittest
from app import app

class TestAPI(unittest.TestCase):
    def setUp(self):
        self.app = app.test_client()
        self.app.testing = True

    def test_get_books(self):
        resp = self.app.get('/books')
        self.assertEqual(resp.status_code, 200)

    def test_add_book(self):
        new = {"title": "TDD with Flask", "author": "Tester", "published_date": "2025-01-01"}
        resp = self.app.post('/books', json=new)
        self.assertEqual(resp.status_code, 201)

if __name__ == '__main__':
    unittest.main()

运行测试:

python test_app.py

五、总结 & 下一步 🏁

通过本指南,您已掌握:

  1. 虚拟环境隔离依赖
  2. Flask 最小应用跑通
  3. 完整 CRUD 端点
  4. 手动 + 单元测试双保险

🔍 上线前最后一步:跑「代码审查助手」,自动捕捉潜在漏洞、性能隐患与风格问题,给出可执行反馈,确保 API 稳如磐石!


六、Bonus:一键生成分页 & 异常处理(进阶)⚡

from flask import abort, request

@app.route('/books')
def get_books_paged():
    page  = int(request.args.get('page', 1))
    limit = int(request.args.get('limit', 10))
    start = (page-1)*limit
    return jsonify(books[start:start+limit])

@app.errorhandler(404)
def resource_not_found(e):
    return jsonify(error=str(e)), 404

七、常见疑问 ❓

Q1. 如何部署到生产?
→ 使用 Gunicorn + Nginx:gunicorn -w 4 app:app

Q2. 如何切换为数据库?
→ 引入 SQLAlchemy + Flask-Migrate,模型替换内存列表即可

Q3. 怎样生成 API 文档?
→ 安装 Flasgger 或 flask-restx,自动根据注释输出 Swagger

📖 想给前端同事一份秒懂的接口文档?「代码文档生成器」可自动生成标准化字段描述、请求/响应示例与错误码,让协作零阻力!


八、结语 🎯

Flask 的轻量级与可扩展性,让它成为中小型 REST 服务的理想选择。跟着本教程,您已拥有:

  • 可运行的 CRUD API
  • 单元测试骨架
  • 分页、异常处理进阶示例

先用「代码生成」快速产出 SDK 与错误重试逻辑,再用 KPI 面板持续监控接口延迟、测试覆盖率与线上错误率,你的 Flask API 将更快、更稳地抢占市场 🚀!

原文链接: https://blog.bytescrum.com/building-a-rest-api-with-flask-a-step-by-step-guide