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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LaTex]arXiv投稿攻略——jpg/png转pdf

一、将图片复制进ppt&#xff0c;右键单击图片选择设置图片格式&#xff0c;获取图片高度和宽度 二、选择“设计-幻灯片大小-自定义幻灯片大小” 三、设置幻灯片大小为图片大小 四、 选择“最大化” 五、 检查幻灯片大小是否与图像大小一致 六、导出为PDF

浅谈Python中的鸭子类型和猴子补丁

文章目录 前言一、鸭子类型二、猴子补丁关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python 开发者可能…

springboot打印启动信息

打印启动信息 转载自:www.javaman.cn 1 spring Bean实例化流程 基本流程&#xff1a; 1、Spring容器在进行初始化时&#xff0c;会将xml或者annotation配置的bean的信息封装成一个BeanDefinition对象&#xff08;每一个bean标签或者bean注解都封装成一个BeanDefinition对象&a…

【Vulnhub靶机】Jarbas--Jenkins

文章目录 信息收集主机发现端口扫描目录爆破 漏洞探测whatwebhash-identifierwhatweb 文档说明&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 靶机下载&#xff1a;Download (Mirror): 信息收集 主机发现 扫描C段 sudo nmap -sn 10.9.75.0/24端口扫描 sudo nma…

装饰者设计模式

package com.jmj.pattern.decorator;/*** 快餐类(抽象构建角色)*/ public abstract class FastFood {private float price;private String desc;public float getPrice() {return price;}public void setPrice(float price) {this.price price;}public String getDesc() {retu…

竞赛选题 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

LV.12 D20 RTC实验 学习笔记

一、RTC简介 RTC(Real Time Clock)即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 二、Exynos4412下的 RTC控制器 它支持…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

基于STM32的OLED多级菜单GUI实现(简化版智能手表)

前言&#xff1a;本文的OLED多级菜单UI为一个综合性的STM32小项目&#xff0c;使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换&#xff0c;搭配DHT11&#xff0c;RTC&#xff0c;LED&#xff0c;…

【机器学习 | 开山篇】打造坚实基础、Kaggle 登榜之路

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Linux中部署MongoDB

在 是一个必要的过程&#xff0c;因为MongoDB是一种流行的NoSQL数据库&#xff0c;它可以在大多数操作系统上使用。在本文中&#xff0c;我们将介绍如何在CentOS 8上部署MongoDB。 MongoDB的下载 您可以从MongoDB官网上下载最新的MongoDB版本。使用以下命令下载MongoDB&#…

SSF-CNN:空间光谱融合的卷积光谱图像超分网络

SSF-CNN: SPATIAL AND SPECTRAL FUSION WITH CNN FOR HYPERSPECTRAL IMAGE SUPER-RESOLUTION 文章目录 SSF-CNN: SPATIAL AND SPECTRAL FUSION WITH CNN FOR HYPERSPECTRAL IMAGE SUPER-RESOLUTION简介解决问题网络框架代码实现训练部分运行结果 简介 ​ 本文提出了一种利用空…

MYSQL 及 SQL 注入

文章目录 前言什么是sql注入防止SQL注入Like语句中的注入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现…

Adversarial Attack on Graph Structured Data(2018 PMLR)

Adversarial Attack on Graph Structured Data----《图结构数据的对抗攻击》 摘要 基于图结构的深度学习已经在各种应用中显示出令人兴奋的结果。然而&#xff0c;与图像或文本对抗攻击和防御的大量研究工作相比&#xff0c;此类模型的鲁棒性却很少受到关注。在本文中&#xf…

⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ InnoDB存储引擎 ⑩⑧【MySQL】详解InnoDB存储引…

Day42力扣打卡

打卡记录 统计子串中的唯一字符&#xff08;找规律&#xff09; 链接 大佬的题解 class Solution:def uniqueLetterString(self, s: str) -> int:ans total 0last0, last1 {}, {}for i, c in enumerate(s):total i - 2 * last0.get(c, -1) last1.get(c, -1)ans tot…

【数据中台】开源项目(2)-Dbus数据总线

1 背景 企业中大量业务数据保存在各个业务系统数据库中&#xff0c;过去通常的同步数据的方法有很多种&#xff0c;比如&#xff1a; 各个数据使用方在业务低峰期各种抽取所需数据&#xff08;缺点是存在重复抽取而且数据不一致&#xff09; 由统一的数仓平台通过sqoop到各个…

网络爬虫(Python:Requests、Beautiful Soup笔记)

网络爬虫&#xff08;Python&#xff1a;Requests、Beautiful Soup笔记&#xff09; 网络协议简要介绍一。OSI参考模型二、TCP/IP参考模型对应关系TCP/IP各层实现的协议应用层传输层网络层 HTTP协议HTTP请求HTTP响应HTTP状态码 Requests&#xff08;Python&#xff09;Requests…

【Vue】@keyup.enter @v-model.trim的用法

目录 keyup.enter v-model.trim 情景一&#xff1a; 情景二&#xff1a; keyup.enter 作用&#xff1a;监听键盘回车事件 上一篇内容&#xff1a; 记事本 https://blog.csdn.net/m0_67930426/article/details/134630834?spm1001.2014.3001.5502 这里有个添加任务的功能&…

ESP32控制数码管实现数字叠加案例

经过了几个小时的接线和代码实现终于搞定了代码&#xff0c;贴出来大家参考下 import machine import time# 定义4个Led的引脚 led1 machine.Pin(5,machine.Pin.OUT) led2 machine.Pin(18,machine.Pin.OUT) led3 machine.Pin(19,machine.Pin.OUT) led4 machine.Pin(21,mac…