使用 Python / Flask 构建 RESTful API

2025-06-08

使用 Python / Flask 构建 RESTful API

Python / Flask 框架组合是构建 Web 应用后端 API 的热门选择之一。通过这种方式构建应用程序的后端,可以为使用不同技术栈构建前端提供多种选择。

在本文中,我们将逐步介绍如何使用 Flask 框架和 SQLite 数据库作为数据存储来构建用于维护 Quotes 的简单 API。

项目设置

创建项目文件夹 -mkdir quotes-api
设置并激活虚拟环境 -虚拟环境设置
在项目的虚拟环境中安装以下包:

 pip install flask
 pip install flask-sqlalchemy
 pip install flask-marshmallow
Enter fullscreen mode Exit fullscreen mode

应用程序设置

在项目文件夹中创建一个名为的文件app.py,并添加必要的导入、应用程序设置代码以及 Marshmallow 库设置,如下所示:

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, String
from flask_marshmallow import Marshmallow
import os


#Application and database setup
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'quotes.db')

db = SQLAlchemy(app)
# Marshmallow library is used for effective object serialization
ma = Marshmallow(app)
Enter fullscreen mode Exit fullscreen mode

数据库设置

让我们将下面的代码添加到文件中,以便我们可以通过 flask 命令app.py创建数据库和种子数据。quotes

#Database creation flask commands
@app.cli.command('db_create')
def db_create():
    db.create_all()
    print('Database created!')


@app.cli.command('db_drop')
def db_drop():
    db.drop_all()
    print('Database dropped!')


@app.cli.command('db_seed')
def db_seed():
    quote1 = Quote(quote_desc='It always seem impossible until it is done.',
                     quote_type='Motivation',
                     author='Nelson Mandela')

    quote2 = Quote(quote_desc='With the new day comes new strength and new thoughts.',
                         quote_type='Motivation',
                         author='Eleanor Roosevelt')

    quote3 = Quote(quote_desc='The secret of getting ahead is getting started.',
                     quote_type='Motivation',
                     author='Mark Twain')

    quote4 = Quote(quote_desc='With self-discipline most anything is possible.',
                     quote_type='Inspiration',
                     author='Theodore Roosevelt')

    quote5 = Quote(quote_desc='It is during our darkest moments that we must focus to see the light.',
                     quote_type='Inspiration',
                     author='Aristotle')


    db.session.add(quote1)
    db.session.add(quote2)
    db.session.add(quote3)
    db.session.add(quote4)
    db.session.add(quote5)
    db.session.commit()
    print('Database seeded!')


# database model
class Quote(db.Model):
    __tablename__ = 'quotes'
    quote_id = Column(Integer, primary_key = True)
    quote_desc = Column(String)
    quote_type = Column(String)
    author = Column(String)


# Quote model added to the Marshmallow library for JSON serialization
class QuoteSchema(ma.Schema):
    class Meta:
        fields = ('quote_id', 'quote_desc', 'quote_type', 'author')


quote_schema = QuoteSchema()
quotes_schema = QuoteSchema(many=True)

Enter fullscreen mode Exit fullscreen mode

在项目的虚拟环境中执行以下代码来创建和播种报价数据:

flask db_create
flask db_seed 
Enter fullscreen mode Exit fullscreen mode

CRUD 操作

现在所有设置部分已完成,添加到app.py文件中的以下方法有助于执行实际的 CRUD(创建、读取、更新和删除)操作。请注意 HTTP 方法和状态代码的正确使用,以指示特定 API 端点的成功或失败。

读取端点

@app.route('/quotes', methods=['GET'])
def quotes():
    quotes_list = Quote.query.all()
    result = quotes_schema.dump(quotes_list)
    return jsonify(result)


@app.route('/quote_details/<int:quote_id>', methods=['GET'])   
def quote_details(quote_id: int):
    quote = Quote.query.filter_by(quote_id=quote_id).first()
    if quote:
        result = quote_schema.dump(quote)
        return jsonify(result)
    else:
        return jsonify(message="That quote does not exist."), 404
Enter fullscreen mode Exit fullscreen mode

添加端点

@app.route('/add_quote', methods=['POST'])   
def add_quote():
    quote_desc = request.form['quote_desc']
    test = Quote.query.filter_by(quote_desc=quote_desc).first()
    if test:
        return jsonify(message="There is already a quote by that description."), 409
    else:
        quote_type= request.form['quote_type']
        author= request.form['author']
        quote =  Quote(quote_desc=quote_desc,
                         quote_type= quote_type,
                         author= author)  
        db.session.add(quote)
        db.session.commit()                 
        return jsonify(message="Quote added successfully!"), 201
Enter fullscreen mode Exit fullscreen mode

更新端点

@app.route('/update_quote/<int:quote_id>', methods=['PUT'])   
def update_quote(quote_id : int):
    quote = Quote.query.filter_by(quote_id=quote_id).first()
    if quote:
        quote.quote_desc = request.form['quote_desc']
        quote.quote_type = request.form['quote_type']
        quote.author= request.form['author']
        db.session.commit()                 
        return jsonify(message="Quote successfully updated!")
    else:
        return jsonify(message="That quote does not exist"), 404
Enter fullscreen mode Exit fullscreen mode

删除端点

@app.route('/remove_quote/<int:quote_id>', methods=['DELETE'])   
def remove_quote(quote_id : int):
    quote = Quote.query.filter_by(quote_id=quote_id).first()
    if quote:
        db.session.delete(quote)
        db.session.commit()                 
        return jsonify(message="Quote successfully deleted!"), 200
    else:
        return jsonify(message="That quote does not exist"), 404
Enter fullscreen mode Exit fullscreen mode

如何测试 API?

将以下代码添加到 app.py 文件的末尾,这样我们就可以使用 启动应用程序了。可以使用Postmanpython app.py应用程序测试 API 端点

if __name__ == '__main__':
    app.run()
Enter fullscreen mode Exit fullscreen mode

后续步骤:

  • 扩展 API 以提供更多端点
  • 使用 JWT 保护 API
  • 使用 react.js、vue.js 或任何其他合适的技术构建前端
  • 通过在任何云平台上安装 WSGI 兼容服务器来部署构建的 API

进一步学习:

鏂囩珷鏉ユ簮锛�https://dev.to/dev0928/build-restful-apis-using-python-flask-56c7
PREV
FastAPI 最佳实践:包含示例的简明指南
NEXT
TypeScript 和 C# 都是由同一个人创建的,他名叫 Anders Hejlsberg 👏 💪 🔥(附视频)趣闻:他还说过,他永远不会创建一种不是开源项目的新编程语言。