使用 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
应用程序设置
在项目文件夹中创建一个名为的文件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)
数据库设置
让我们将下面的代码添加到文件中,以便我们可以通过 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)
在项目的虚拟环境中执行以下代码来创建和播种报价数据:
flask db_create
flask db_seed
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
添加端点
@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
更新端点
@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
删除端点
@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
如何测试 API?
将以下代码添加到 app.py 文件的末尾,这样我们就可以使用 启动应用程序了。可以使用Postmanpython app.py
应用程序测试 API 端点。
if __name__ == '__main__':
app.run()
后续步骤:
- 扩展 API 以提供更多端点
- 使用 JWT 保护 API
- 使用 react.js、vue.js 或任何其他合适的技术构建前端
- 通过在任何云平台上安装 WSGI 兼容服务器来部署构建的 API
进一步学习:
- https://restfulapi.net/
- https://httpstatuses.com/
- https://flask-marshmallow.readthedocs.io/en/latest/