12步构建Flask REST API教程 [2026版](2026-07-27)

你是不是也曾看着一堆API文档感到头皮发麻?别担心,Flask 作为Python最轻量级的Web框架,一直以“简单到飞起”著称。2026年,Flask生态更加成熟,构建REST API几乎就像搭积木。今天,我们用12个步骤,从零开始构建一个完整的REST API。

本教程将带你完成一个图书管理系统API,支持CRUD操作(创建、读取、更新、删除),并包含认证、错误处理和部署准备。全部代码可在GitHub上获取(链接见文末)。


第一步:环境准备与项目初始化

安装Flask及相关库

pip install flask flask-sqlalchemy flask-marshmallow flask-cors

第二步:创建Flask应用骨架

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from flask_cors import CORS

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///books.db'
db = SQLAlchemy(app)
ma = Marshmallow(app)
CORS(app)

实用建议:开发阶段用SQLite,生产环境换成PostgreSQL或MySQL。


第三步:定义数据模型(Model)

一个“书”模型,包含ID、书名、作者、出版年份、ISBN:

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    author = db.Column(db.String(200), nullable=False)
    year = db.Column(db.Integer)
    isbn = db.Column(db.String(13), unique=True)

    def __repr__(self):
        return f'<Book {self.title}>'

第四步:创建数据库与初始数据

with app.app_context():
    db.create_all()
    # 插入示例数据
    if not Book.query.first():
        sample_book = Book(title="Flask实战", author="李华", year=2026, isbn="9781234567890")
        db.session.add(sample_book)
        db.session.commit()
        print("✅ 示例数据已插入")

案例数据:目前数据库中有1本书,后续可通过API添加更多。


第五步:定义序列化器(Schema)

from marshmallow import fields, validate

class BookSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Book
        load_instance = True
    isbn = fields.String(validate=validate.Length(min=13, max=13))

book_schema = BookSchema()
books_schema = BookSchema(many=True)

第六步:构建GET端点——获取所有图书

@app.route('/api/books', methods=['GET'])
def get_books():
    all_books = Book.query.all()
    return books_schema.jsonify(all_books), 200

调用方式:GET http://localhost:5000/api/books

返回示例:

[
  {
    "id": 1,
    "title": "Flask实战",
    "author": "李华",
    "year": 2026,
    "isbn": "9781234567890"
  }
]

第七步:构建GET端点——获取单本书

@app.route('/api/books/<int:id>', methods=['GET'])
def get_book(id):
    book = Book.query.get_or_404(id)
    return book_schema.jsonify(book), 200

第八步:构建POST端点——创建新书

@app.route('/api/books', methods=['POST'])
def create_book():
    json_data = request.get_json()
    if not json_data:
        return {"message": "No input data provided"}, 400
    book = book_schema.load(json_data, session=db.session)
    db.session.add(book)
    db.session.commit()
    return book_schema.jsonify(book), 201

隐蔽陷阱:记得做输入验证!例如ISBN必须13位。


第九步:构建PUT端点——更新图书

@app.route('/api/books/<int:id>', methods=['PUT'])
def update_book(id):
    book = Book.query.get_or_404(id)
    json_data = request.get_json()
    book = book_schema.load(json_data, instance=book, session=db.session)
    db.session.commit()
    return book_schema.jsonify(book), 200

第十步:构建DELETE端点——删除图书

@app.route('/api/books/<int:id>', methods=['DELETE'])
def delete_book(id):
    book = Book.query.get_or_404(id)
    db.session.delete(book)
    db.session.commit()
    return {"message": "Book deleted"}, 200

第十一步:添加认证与错误处理

简单Token认证(Mock)

@app.before_request
def require_auth():
    if request.endpoint and request.method in ['POST', 'PUT', 'DELETE']:
        token = request.headers.get('Authorization')
        if token != 'Bearer secret-token-2026':
            return {"message": "Unauthorized"}, 401

全局错误处理

@app.errorhandler(404)
def not_found(error):
    return {"message": "Resource not found"}, 404

@app.errorhandler(500)
def internal_error(error):
    return {"message": "Internal server error"}, 500

第十二步:运行与测试

启动服务

python app.py

使用curl测试

# 获取所有书
curl http://localhost:5000/api/books

# 创建新书(需要认证)
curl -X POST http://localhost:5000/api/books \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer secret-token-2026" \
  -d '{"title":"Docker入门","author":"王伟","year":2025,"isbn":"9780987654321"}'

实用建议:用Postman或Insomnia进行可视化测试,比curl更高效。


行动号召

现在轮到你动手了!复制以上代码并运行,你会惊讶于Flask的简洁与强大。如果遇到问题,请分享你的错误日志到评论区,大家一起解决。

🌟 小挑战:尝试添加一个GET /api/books/search?q=Flask端点,实现模糊搜索功能。


本教程完整代码

GitHub仓库:Flask-REST-API-Tutorial-2026(请替换为你的仓库链接)


免责声明:本文是一篇技术教程,提供的信息仅用于教育目的。文中代码示例可能在特定环境中需要调整。作者不对因使用本文内容而产生的任何直接或间接损失承担责任。请在实际项目中遵循安全最佳实践,例如使用HTTPS、真正的认证机制(如JWT)和环境变量管理密钥。