Python Flask 开发用于访问数据库的 REST API

devtools/2025/3/14 21:17:06/

Python Flask 开发用于访问数据库的 REST API

  • Python Flask 开发用于访问数据库的 REST API

Python Flask 开发用于访问数据库的 REST API

为了说明如何使用 Flask 和 Flask-RESTful 扩展构建 REST API,我们将修改之前网页应用程序,并使用 REST 架构风格访问 Student 对象(Resource对象)。我们希望在请求正文中为 PUTPOST 方法发送参数,而 API 将以 JSON 格式发回响应。带有 REST API 接口的修订版代码如下所示:

python">from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from flask_restful import Api, Resource, reqparseapp = Flask(__name__)
api = Api(app)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///student.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

在前面的代码片段中,我们首先初始化了 Flask 应用程序和数据库实例。下一步,我们使用 Flask 实例创建了一个 API 实例。我们通过 api = Api(app) 语句实现了这一点。这个 API 实例是开发其余 API 应用程序的关键,我们将使用它。

接下来,我们需要配置 reqparse 实例,注册我们希望从 HTTP 请求中解析的参数。在我们的代码示例中,我们注册了两个字符串类型的参数:namegrade,如以下代码片段所示:

python">parser = reqparse.RequestParser()
parser.add_argument('name', type=str)
parser.add_argument('grade', type=str)

下一步是创建 Student 模型对象,这与我们前面写过的代码中的操作相同,只是我们将添加一个 serialize 方法,将对象转换为 JSON 格式。这是将 JSON 响应序列化后再发送回 发送给 API 客户端之前序列化 JSON 响应的重要步骤。还有其他解决方案可以实现同样的目的,但出于简单的原因,我们选择了 此选项。创建 Student 对象的精确示例代码如下:

python">class Student(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), nullable=False)grade = db.Column(db.String(20), nullable=True)def serialize(self):return {'id': self.id,'name': self.name,'grade': self.grade,}

接下来,我们创建两个 Resource 对象,用来访问学生数据库对象。有两个 Resource 对象,分别是 StudentDaoStudentListDao,下面是对做它们的描述:

  • StudentDao:它为每一个单独的资源实例提供了像 getdelete 这样的方法,这些方法会被映射到 HTTP 协议的 GETDELETGE 方法;
  • StudentListDao:它提供了像 getpost 这样的方法。添加 get 方法是为了使用 HTTP 的 GET 方法提供所有的 Student 类型的资源的列表。添加 post 方法是为了使用 HTTP 的 POST 方法添加一个新资源对象。这是一种典型的设计模式,用于实现网页资源的 CRUD 功能。

至于为 StudentDaoStudentListDao 类实现的方法,我们在一条语句中返回状态代码和对象本身。这是 Flask-RESTful 扩展提供的便利。下面是这两个类的代码:

python">class StudentDao(Resource):def get(self, student_id):student = Student.query.filter_by(id=student_id).first_or_404(description='没有 ID 是 {} 的学生'.format(student_id))return student.serialize()def delete(self, student_id):student = Student.query.filter_by(id=student_id).first_or_404(description='没有 ID 是 {} 的学生'.format(student_id))db.session.delete(student)db.commit()return '', 204class StudentListDao(Resource):def get(self):students = Student.query.all()return [Student.serialize(student) for student in students]def post(self):args = parser.parse_args()name - =args['name']grade - =args['grade']student = Student(name=name, grade=grade)db.session.add(student)db.session.commit()return student, 200

对于 StudentListDao 类的 post 方法,我们使用 reqparse 解析器从请求中提取了姓名和成绩参数。POST 方法的其他实现与前面应用程序示例中的相同。

在示例 API 应用程序的后面两行中,我们将 URL 映射到了资源对象。所有指向 /students/<student_id> 的请求都将重定向到 StudentDao 资源类。所有指向 /students 的请求都将重定向到 StudentListDao 资源类:

python">api.add_resource(StudentDao, '/student/<student_id>')
api.add_resource(StudentListDao, '/student/list')

对于 在本代码示例中,我们没有添加错误和异常处理,以保持代码简洁,便于讨论。但我们强烈建议在最终实现中加入错误和异常处理。但我们强烈建议在最终实现中加入这一点。

下面是完整的代码:

python"># 学生资源的 REST API 应用程序
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from flask_restful import Api, Resource, reqparseapp = Flask(__name__)
api = Api(app)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///student.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)parser = reqparse.RequestParser()
parser.add_argument('name', type=str)
parser.add_argument('grade', type=str)class Student(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), nullable=False)grade = db.Column(db.String(20), nullable=True)def serialize(self):return {'id': self.id,'name': self.name,'grade': self.grade,}class StudentDao(Resource):def get(self, student_id):student = Student.query.filter_by(id=student_id).first_or_404(description='没有 ID 是 {} 的学生'.format(student_id))return student.serialize()def delete(self, student_id):student = Student.query.filter_by(id=student_id).first_or_404(description='没有 ID 是 {} 的学生'.format(student_id))db.session.delete(student)db.commit()return '', 204class StudentListDao(Resource):def get(self):students = Student.query.all()return [Student.serialize(student) for student in students]def post(self):args = parser.parse_args()name - =args['name']grade - =args['grade']student = Student(name=name, grade=grade)db.session.add(student)db.session.commit()return student, 200api.add_resource(StudentDao, '/student/<student_id>')
api.add_resource(StudentListDao, '/student/list')

<完>


http://www.ppmy.cn/devtools/166654.html

相关文章

Git与GitHub:理解两者差异及其关系

目录 Git与GitHub&#xff1a;理解两者差异及其关系Git&#xff1a;分布式版本控制系统概述主要特点 GitHub&#xff1a;基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub&#xff1a;理解两者差异及其关系 Git&#xff1a;分布式版本控…

SQL 别名

在 SQL 中&#xff0c;别名&#xff08;alias&#xff09;是一种用于临时重命名表或列的方式。使用别名可以使查询结果更具可读性或简洁性&#xff0c;尤其是在处理复杂的查询时。 列别名 可以使用 AS 关键字来为查询结果中的列指定一个别名。AS 是可选的&#xff0c;直接指定…

基于传统算法的半导体晶圆缺陷检测原理及代码(二)

引言 半导体晶圆制造是一个极其复杂且高度精密的过程&#xff0c;在晶圆制造过程中&#xff0c;由于各种因素的影响&#xff0c;如原材料质量、工艺控制、设备精度等&#xff0c;不可避免地会产生各种缺陷。这些缺陷如果不能及时检测和处理&#xff0c;将会严重影响芯片的性能…

哪些业务场景更适合用MongoDB?何时比MySQL/PostgreSQL好用?

哪些业务场景更适合用MongoDB&#xff1f;何时比MySQL/PostgreSQL好用&#xff1f; 就像淘宝的个性化推荐需要灵活调整商品标签&#xff0c;MongoDB这种"变形金刚"式的数据库&#xff0c;在处理以下三类中国特色业务场景时更具优势&#xff1a; 一、动态数据就像&q…

Python性能优化面试题及参考答案

目录 解释字典与列表在查找操作中的时间复杂度差异,如何利用哈希表特性提升性能? 为什么在只读场景下使用元组(tuple)比列表(list)更高效? 如何用 collections.deque 优化频繁的队列插入 / 删除操作? defaultdict 相比普通字典在哪些场景下能减少冗余代码并提升效率…

【GPT入门】第8课 大语言模型的自洽性

【GPT入门】第8课 大语言模型的自洽性 1.自洽性概念2.代码&#xff08;观察执行结果&#xff09;3.自洽性核心思想 1.自洽性概念 大模型的自洽性&#xff08;self - consistency&#xff09;是指在推理阶段&#xff0c;大模型通过生成多个答案并选择出现频率最高的那个&#x…

【AI学习从零至壹】Pytorch逻辑回归

Pytorch逻辑回归 线性回归简单线性回归的参数估计概率和似然的区别 最⼤似然估计似然函数对数似然函数 逻辑回归梯度下降法下⼭问题梯度与学习率学习率 梯度下降法的模拟与可视化学习率对梯度的影响学习率的最佳取值 梯度更新逻辑回归模型构建及训练流程 线性回归 线性回归的⽬…

Spring (十)事务

目录 一 Spring数据库的相关配置&#xff1a; 1 导入包&#xff1a; 2 配置数据库连接信息 3 可以直接使用&#xff1a;DataSource,JdbcTemplate 二 事务管理&#xff1a; 1 事务管理的实现 1.1 开启Spring事务管理 1.2 为指定方法添加事务 2 关键类与接口 2.1 事务拦…