RESTful API 架构快速入门 Flask实现
RESTful 简介

1.1 为什么要使用 RESTful 架构?
Representational State Transfer(REST)是一种面向资源的架构风格,广泛应用于网络服务的设计和开发。使用RESTful架构有以下几个优点:
-
简单性和可扩展性: RESTful 架构基于简单的原则和标准,易于理解和实现。它的设计使得系统更具有可扩展性,便于适应不断变化的需求。
-
松耦合: RESTful 架构支持松耦合,客户端和服务器之间的交互是无状态的,每个请求都包含足够的信息使其独立完成。这促使系统组件之间的独立性,使得修改一个组件不会影响其他组件。
-
可见性: RESTful 架构通过使用统一的接口,使得资源的状态和操作对客户端可见。这提高了系统的可维护性和可理解性。
1.2 RESTful API 请求设计
设计 RESTful API 请求时应考虑以下几个方面:
-
资源标识: 每个资源都应有唯一的标识,通常通过 URI(Uniform Resource Identifier)表示。URI应该清晰地指示资源的位置和唯一性。
-
HTTP 方法: 使用 HTTP 方法(GET、POST、PUT、DELETE 等)来表示对资源的不同操作。例如,GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。
-
请求参数: 可以通过 URI 查询参数、请求头或请求体传递参数。参数的设计应符合标准,易于理解和使用。
1.3 RESTful API 响应设计
设计 RESTful API 响应时需要考虑以下几个方面:
-
状态码: 使用合适的 HTTP 状态码来表示请求的结果,如200 OK表示成功,404 Not Found表示资源未找到,等等。
-
响应体: 响应体应包含所请求资源的表示形式,通常使用 JSON 或 XML 格式。这使得数据在客户端和服务器之间的传输更加灵活和可扩展。
-
超媒体: 使用超媒体作为应用程序状态的引擎,使得客户端可以通过解析响应中的超媒体链接来发现和使用相关资源。
通过合理设计 RESTful API 请求和响应,可以构建出清晰、可维护、可扩展的系统,实现客户端和服务器之间的有效通信。
Flask例子
__init__.py
from flask import Flask from .extensions import api, db
from .resources import nsdef create_app():app = Flask(__name__)app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///db.sqlite3"api.init_app(app)db.init_app(app)api.add_namespace(ns)return app
api_models.py
# 导入 Flask-Restx 框架的 fields 模块
from flask_restx import fields# 从自定义的 extensions 模块中导入 api 对象
from .extensions import api# 定义一个名为 "Student" 的模型,包含 id(整数)、name(字符串)和一个嵌套的 course_model 字段
student_model = api.model("Student", {"id": fields.Integer, # 学生 ID,类型为整数"name": fields.String, # 学生名称,类型为字符串#"course": fields.Nested(course_model) # 嵌套的课程模型字段,该行代码被注释掉了
})# 定义一个名为 "Course" 的模型,包含 id(整数)、name(字符串)和一个嵌套的 students 字段,是一个学生列表
course_model = api.model("Course", {"id": fields.Integer, # 课程 ID,类型为整数"name": fields.String, # 课程名称,类型为字符串"students": fields.List(fields.Nested(student_model)) # 嵌套的学生列表字段
})# 定义一个名为 "CourseInput" 的模型,用于接收创建课程时的输入数据
course_input_model = api.model("CourseInput", {"name": fields.String, # 课程名称,类型为字符串
})# 定义一个名为 "StudentInput" 的模型,用于接收创建学生时的输入数据
student_input_model = api.model("StudentInput", {"name": fields.String, # 学生名称,类型为字符串"course_id": fields.Integer # 所属课程的 ID,类型为整数
})
extensions.py
from flask_sqlalchemy import SQLAlchemy
from flask_restx import Apiapi = Api()
db = SQLAlchemy()
models.py
from .extensions import db class Course(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), unique=True)students = db.relationship("Student", back_populates="course")class Student(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), unique=True)course_id = db.Column(db.ForeignKey("course.id"))course = db.relationship("Course", back_populates="students")
resources.py
# 导入 Flask-Restx 框架的 Resource 类和 Namespace 类
from flask_restx import Resource, Namespace # 导入自定义的 API 模型和数据库模型
from .api_models import course_model, student_model, course_input_model, student_input_model
from .extensions import db
from .models import Course, Student# 创建一个命名空间对象,用于组织和管理 API 路由
ns = Namespace("api")# 创建一个处理 "/hello" 路由的 Resource 类
@ns.route("/hello")
class Hello(Resource):def get(self):return {"hello": "restx"}# 创建处理 "/courses" 路由的 Resource 类
@ns.route("/courses")
class CourseListAPI(Resource):# 使用 course_model 进行响应数据的序列化@ns.marshal_list_with(course_model)def get(self):# 返回所有课程的查询结果return Course.query.all()# 使用 course_input_model 进行请求数据的验证# 使用 course_model 进行响应数据的序列化@ns.expect(course_input_model)@ns.marshal_with(course_model)def post(self):# 从请求中获取课程名称,并创建新的课程对象course = Course(name=ns.payload["name"])# 将新课程对象添加到数据库中db.session.add(course)# 提交数据库事务db.session.commit()# 返回创建的课程对象和状态码 201(表示资源创建成功)return course, 201# 创建处理 "/courses/<int:id>" 路由的 Resource 类
@ns.route("/courses/<int:id>")
class CourseAPI(Resource):# 使用 course_model 进行响应数据的序列化def get(self, id):# 根据课程 ID 查询并返回相应的课程对象course = Course.query.get(id)return course# 使用 course_input_model 进行请求数据的验证# 使用 course_model 进行响应数据的序列化def put(self, id):# 根据课程 ID 查询相应的课程对象course = Course.query.get(id)# 更新课程对象的名称course.name = ns.payload["name"]# 提交数据库事务db.session.commit()# 返回更新后的课程对象return course# 删除指定 ID 的课程对象def delete(self, id):course = Course.query.get(id)db.session.delete(course)db.session.commit()# 返回空响应体和状态码 204(表示资源删除成功)return {}, 204# 创建处理 "/students" 路由的 Resource 类
@ns.route("/students")
class StudentListAPI(Resource):# 使用 student_model 进行响应数据的序列化def get(self):# 返回所有学生的查询结果return Student.query.all()# 使用 student_input_model 进行请求数据的验证# 使用 student_model 进行响应数据的序列化def post(self):# 从请求中获取学生名称和所属课程 ID,并创建新的学生对象student = Student(name=ns.payload["name"], course_id=ns.payload["course_id"])# 将新学生对象添加到数据库中db.session.add(student)# 提交数据库事务db.session.commit()# 返回创建的学生对象和状态码 201(表示资源创建成功)return student, 201# 创建处理 "/students/<int:id>" 路由的 Resource 类
@ns.route("/students/<int:id>")
class StudentAPI(Resource):# 使用 student_model 进行响应数据的序列化def get(self, id):# 根据学生 ID 查询并返回相应的学生对象student = Student.query.get(id)return student# 使用 student_input_model 进行请求数据的验证# 使用 student_model 进行响应数据的序列化def put(self, id):# 根据学生 ID 查询相应的学生对象student = Student.query.get(id)# 更新学生对象的名称和所属课程 IDstudent.name = ns.payload["name"]student.course_id = ns.payload["course_id"]# 提交数据库事务db.session.commit()# 返回更新后的学生对象return student# 删除指定 ID 的学生对象def delete(self, id):student = Student.query.get(id)db.session.delete(student)db.session.commit()# 返回空响应体和状态码 204(表示资源删除成功)return {}, 204
相关文章:
RESTful API 架构快速入门 Flask实现
RESTful 简介 1.1 为什么要使用 RESTful 架构? Representational State Transfer(REST)是一种面向资源的架构风格,广泛应用于网络服务的设计和开发。使用RESTful架构有以下几个优点: 简单性和可扩展性: RE…...
gitee仓库使用教程
下载安装git;在本地项目文件夹右击鼠标点击Git Bash Here;输入git init,这个目录变成git可以管理的仓库,会出现一个.git文件夹,如果没出现的话需要选择“显示隐藏文件”(不会的同学自行百度一下) 4.绑定本地…...
【ARM CoreLink 系列 3.2 -- CCI-400,CCI-500, CCI-550 差异】
文章目录 CCI-400 和 CCI-500 差异ARM CCI-400ARM CCI-500ARM CCI-550CCI-400 和 CCI-500 差异 ARM的 CCI(Cache Coherent Interconnect)系列产品是用于多核处理器之间的高性能缓存一致性互连。CCI-400 和 CCI-500 是该系列中的两种设计,它们旨在允许多个处理器核心和其他资…...
Java8 对象List 排序
目录 1.stream流式排序 1.使用说明: 2.多字段排序 2.Collections.sort(......) 排序 1.stream流式排序 Java8提供了流式操作来简化我们的编程,比如排序、分组、过滤、Map操作等API,配合Lambda表达式给我们编程带来了很大的便利,这篇文章重…...
【深度学习】DAMO-YOLO,阿里,701类通用检测模型,目标检测
https://github.com/tinyvision/DAMO-YOLO/blob/master/README_cn.md DAMO-YOLO是由阿里巴巴达摩院智能计算实验室TinyML团队开发的一个兼顾速度与精度的目标检测框架,其效果超越了目前的一众YOLO系列方法,在实现SOTA的同时,保持了很高的推理速度。DAMO…...
Day45:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
文章目录 300.最长递增子序列思路代码实现 674. 最长连续递增序列思路代码实现 718. 最长重复子数组思路代码实现 300.最长递增子序列 题目链接 思路 单个字符都是一个长为1的子序列,直接初始化dp为1。先固定一个元素位置i,判断0-i范围内到i的最长子序…...
浅析基于物联网的远程抄表系统的设计及应用
安科瑞 华楠 摘 要:本文基于物联网的概念,使用 ZigBee、通用分组无线服务技术两种无线通信技术相结合的方式实现远程抄表并对数据进行存储和管理。此系统设计主要分为硬件方面的设计和软件方面的设计,硬件方面的设计需要完成三个部分的硬件制…...
springboot(ssm付费自习室管理系统 自习室预约平台Java(codeLW)
springboot(ssm付费自习室管理系统 自习室预约平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&am…...
【Spring】Spring事务详解
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…...
跟我学c++高级篇——静态反射实现之一
一、非侵入式的静态反射(自省) 在前面分析过,反射有静态和动态两类形式,前者在编译期实现,后者在运行期实现。而针对c这类天然不支持(或者说极弱支持)反射的语言,在实现上又可以分为…...
人工智能|机器学习——循环神经网络的简洁实现
循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 t…...
02_MySQL体系结构及数据文件介绍
#课程目标 了解MySQL的体系结构了解MySQL常见的日志文件及作用了解事务的控制语句,提交和回滚能够查看当前数据库的版本和用户了解MySQL数据库如何存放数据能在使用SQL语句创建、删除数据库 #一、MySQL的体系结构 ##1、客户端(连接者) MySQL的客户端可以是某个客户…...
【Web安全】xsstrike工具使用方法表格
xsstrike工具使用方法表格 版本:XSStrike v3.1.5 项目地址: https://github.com/s0md3v/XSStrike使用文档: usage: xsstrike.py [-h] [-u TARGET] [--data PARAMDATA] [-e ENCODE] [--fuzzer] [--update] [--timeout TIMEOUT] [--proxy][…...
python实现鼠标实时坐标监测
python实现鼠标实时坐标监测 一、说明 使用了以下技术和库: tkinter:用于创建GUI界面。pyperclip:用于复制文本到剪贴板。pynput.mouse:用于监听鼠标事件,包括移动和点击。threading:用于创建多线程&…...
【华为OD】C卷真题 100%通过:攀登者1 C/C++源码实现
【华为OD】C卷真题 100%通过:攀登者1 C/C源码实现 目录 题目描述: 示例1 代码实现: 题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置&…...
Flask,uWSGI,nginx的理解
文章目录 前言与背景理解 - FlaskuWSGInginx理解 - nginx理解 - FlaskuWSGI理解 - vuedjangonginx 前言与背景 此篇文章是针对小白的一篇理解Flask,uWSGI,nginx的文章,只介绍了理解,并没有介绍如何部署。 由于工作需要使用flask…...
【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)
🌈个人主页: Aileen_0v0🔥系列专栏:Java学习系列专栏💫个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 私有成员变量在继承中的使用编辑 当子类和父类变量不重名时: 当子类和父类重名时: 📝总结: 继承的含义: …...
单细胞seurat入门—— 从原始数据到表达矩阵
根据所使用的建库方法,单细胞的RNA序列(也称为读取(reads)或标签(tags))将从转录本的3端(或5端)(10X Genomics,CEL-seq2,Drop-seq&…...
Docker部署Nacos
此篇文章使用的nacos为2.2.1版本 拉取Nacos镜像 docker pull nacos/nacos-server:v2.2.1先将容器启动起来 docker run -d \ --name nacos \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ --privilegedtrue \ -e JVM_XMS256m \ -e JVM_XMX256m \ -e MODEstandalone \ -e NA…...
1005. K 次取反后最大化的数组和
原题链接:1005. K 次取反后最大化的数组和 思路: 先把数组排序好,然后直接从下标0(最小的负数)开始反转,那么接下来有两种情况: 1.负数反转完了,k还有剩余。此时因为nums内全部都是正数,所以我…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
