RESTful API最佳实践:Python构建指南

目录

一、引言

二、RESTful API设计原则

三、Python构建RESTful API的技术栈

四、Flask构建RESTful API实践

安装Flask

定义路由和资源

处理HTTP方法

错误处理

数据验证和序列化

使用Flask扩展

五、最佳实践案例

七、结论   


一、引言

在当今的软件开发领域,RESTful API(Representational State Transfer,表述性状态转移)已成为构建Web服务和应用程序间通信的主流方式。RESTful API的设计和实现对于提高系统的可维护性、可扩展性和易用性至关重要。本文旨在介绍使用Python构建RESTful API的最佳实践,并通过案例和代码示例,帮助初学者掌握相关知识。

二、RESTful API设计原则

  • 资源定位:RESTful API应基于资源进行设计,每个资源都有一个唯一的URL进行标识。资源可以是数据集合或单个数据项,如用户、订单等。
  • HTTP方法:使用HTTP标准方法(GET、POST、PUT、DELETE等)来表示对资源的操作。GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。
  • 无状态性:RESTful API应该是无状态的,即服务器不保存客户端的会话信息。每次请求都应该包含理解请求所必需的信息。
  • HATEOAS(Hypermedia as the Engine of Application State):通过在响应中包含链接和动作,使客户端能够发现可以执行的操作。这有助于降低客户端和服务器之间的耦合度。

三、Python构建RESTful API的技术栈

在Python中,构建RESTful API常用的技术栈包括Flask、Django REST framework、FastAPI等。这些框架提供了丰富的功能和灵活的扩展性,能够满足大多数项目需求。以下以Flask为例进行介绍。

四、Flask构建RESTful API实践

安装Flask

使用pip安装Flask:

pip install Flask

定义路由和资源

在Flask中,通过装饰器@app.route()定义路由,并指定对应的处理函数。例如,以下代码定义了一个获取用户列表的路由:

from flask import Flask, jsonify  app = Flask(__name__)  users = [  {'id': 1, 'name': 'Alice', 'age': 25},  {'id': 2, 'name': 'Bob', 'age': 30},  # ...  
]  @app.route('/users', methods=['GET'])  
def get_users():  return jsonify(users)  if __name__ == '__main__':  app.run(debug=True)

处理HTTP方法

通过指定methods参数,可以定义路由支持的HTTP方法。例如,以下代码定义了一个创建用户的路由,支持POST方法:

from flask import request  @app.route('/users', methods=['POST'])  
def create_user():  data = request.get_json()  new_user = {'id': len(users) + 1, **data}  users.append(new_user)  return jsonify(new_user), 201

错误处理

在API中,错误处理是非常重要的。Flask提供了abort()函数用于触发HTTP错误响应,也可以使用自定义的异常处理器来处理特定类型的错误。

数据验证和序列化

在处理请求和响应时,数据验证和序列化是必不可少的。可以使用第三方库(如Marshmallow)来帮助完成这些工作。

使用Flask扩展

Flask提供了丰富的扩展库,用于处理各种常见任务,如数据库操作(SQLAlchemy、Flask-Migrate等)、身份认证(Flask-Login、Flask-JWT-Extended等)、API文档生成(Flask-RESTPlus、Flask-APISpec等)。

五、最佳实践案例

以下是一个使用Flask构建RESTful API的完整案例,包括用户资源的增删改查操作:

from flask import Flask, jsonify, request, abort  
from flask_sqlalchemy import SQLAlchemy  app = Flask(__name__)  
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db'  
db = SQLAlchemy(app)  class User(db.Model):  id = db.Column(db.Integer, primary_key=True)  name = db.Column(db.String(80), nullable=False)  email = db.Column(db.String(120), unique=True, nullable=False)  # 定义路由和资源操作...  @app.route('/users/<int:user_id>', methods=['GET'])  
def get_user(user_id):  user = User.query.get(user_id)if not user:abort(404, description=f"User {user_id} not found")return jsonify(user.to_dict())@app.route('/users', methods=['POST'])
def create_user():data = request.get_json()if not data or not data.get('name') or not data.get('email'):abort(400, description="Name and email are required")# 检查电子邮件是否唯一  user_with_same_email = User.query.filter_by(email=data['email']).first()  if user_with_same_email:  abort(400, description="Email already exists")  new_user = User(name=data['name'], email=data['email'])  db.session.add(new_user)  db.session.commit()  return jsonify(new_user.to_dict()), 201
@app.route('/users/int:user_id', methods=['PUT'])
def update_user(user_id):user = User.query.get(user_id)if not user:abort(404, description=f"User {user_id} not found")data = request.get_json()  if not data:  abort(400, description="No data provided to update")  # 更新用户信息(此处仅更新name作为示例)  if 'name' in data:  user.name = data['name']  db.session.commit()  return jsonify(user.to_dict())
@app.route('/users/int:user_id', methods=['DELETE'])
def delete_user(user_id):user = User.query.get(user_id)if not user:abort(404, description=f"User {user_id} not found")db.session.delete(user)  db.session.commit()  return '', 204
添加User模型到字典的转换方法
def to_dict(self):return {'id': self.id,'name': self.name,'email': self.email
}

将to_dict方法添加到User类中(注意:这里应该是一个类方法,但为了简洁,我们直接在示例中定义)

User.to_dict = to_dictif name == 'main':
# 创建数据库表(如果尚未存在)db.create_all()app.run(debug=True)

注意:在实际应用中,`to_dict` 方法应该是一个类的实例方法,而不是像上面那样直接定义在全局作用域中。     

七、结论   

本文介绍了使用Python构建RESTful API的最佳实践,并通过Flask框架的示例代码进行了详细说明。遵循这些最佳实践可以帮助你构建出易于使用、安全可靠的RESTful API。同时,不断学习和探索新的技术和方法也是非常重要的,以应对不断变化的业务需求和技术挑战。
 

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

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

相关文章

SpringBoot 项目创建和 IDEA 常见问题

1、 Cannot save Files 问题(无法自动保存项目文件) Cannot save ....../HelloWord.java. Unable to create a backup file (HelloWord.java~). The file left unchanged. 原因&#xff1a;DIEA无法在保存前备份文件 解决办法&#xff1a;找到 Files --> Settings... -->…

谁是最会写作文的AI“考生”?“阅卷老师”ChatGPT直呼惊艳!

文章推荐 粽叶飘香&#xff0c;端午安康&#xff01;AI视频送祝福啦~ AI日报&#xff5c;文生语音大模型国内外均有突破&#xff0c;Pika完成6亿新融资&#xff0c;视频大模型也不远了&#xff01; ⭐️搜索“可信AI进展“关注公众号&#xff0c;获取当日最新AI资讯 一年一…

Claude3 注册及升级教程(包含封号解决方法)

前言 最近大家呼声很高的 Claude3 &#xff0c;它的 注册以及升级 教程来了&#xff01;&#xff01;&#xff01; &#xff08;还有封号情况的解决方式放在了后面&#xff09; 废话不多说&#xff0c;直接进入教程。 Claude 3 注册 前期准备工作 一个国外的邮箱账号&#…

HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

windows上修改Podman的镜像配置源加速

目录 前言解决办法1. 打开window的Powershell 2. 修改registries.conf3. 重启podman即可 扩展内容1. 国内镜像源地址2. 阿里加速地址 前言 今天在电脑上准备通过podman安装mysql&#xff0c;结果执行安装命令后&#xff0c;网络不通没法下载镜像。 解决办法 将默认镜像源修改…

释放创意潜力:AI写作助手如何助力内容创作?

内容为王&#xff0c;在内容创作的世界中尤为重要。然而&#xff0c;面对写作时常常感到无从下手&#xff1a;有时缺乏灵感&#xff0c;有时难以表达清楚自己的想法。AI写作助手的出现&#xff0c;为这些问题提供了创新的解决方案&#xff0c;极大地改变了内容创作的过程。 今…

C++: shared_ptr是线程安全的吗

导读 C面试中有时会有这样一个问题&#xff0c;shared_ptr是线程安全的吗&#xff1f;对此问题&#xff0c;我们需要从三个并发场景进行考虑&#xff0c;拷贝shared_ptr的安全性、对shared_ptr赋值的安全性和读写shared_ptr指向内存区域的安全性。 对于以上问题&#xff0c;首…

奥特曼28亿「投资帝国」曝光!不要OpenAI股份,当CEO最不赚钱

Sam Altman十几年来建立的庞大投资帝国&#xff0c;让我们终于理解了他为什么可以不要OpenAI的股权。 内容提要 作为一家曾经的小型非盈利组织&#xff0c;OpenAI以创纪录的速度迅速成长为估值860亿美元的独角兽。 虽然这大多归功于Sam Altman和微软达成的商业合作&#xff…

超强 BAAS 神器:支持自动生成API、对象存储、静态托管,云函数!

想象一下&#xff0c;你是一名开发者&#xff0c;你有一种强大的神器&#xff0c;可以让你摆脱繁琐的服务搭建和接口开发&#xff0c;免费使用众多第三方认证服务、对象存储、云函数和静态部署。这就是MemFire Cloud&#xff01; MemFire Cloud是懒人开发者的福音&#xff0c;一…

开源VisualFbeditor中文版,vb7 IDE,VB6升级64位跨平台开发安卓APP,Linux程序

吴涛老矣&#xff0c;社区苦无64位易语言&#xff0c;用注入DLL增强菜单&#xff0c;做成VS一样的界面 终归是治标不治本&#xff0c;一来会报毒&#xff0c;二来闭源20年没更新了 开源的VB7&#xff0c;欢迎易语言的铁粉进群&#xff1a;1032313876 【Freebasic编程语言】编绎…

Transformer论文解读

目录 写在前面 一、Transformer要解决的问题 1.长距离依赖问题 2.序列处理瓶颈 二、整体结构 三、自注意力机制 1.Scaled Dot-Product Attention 2.Multi-Head Attention 四、Position-wise Feed-Forward Networks&#xff08;FFN&#xff09; 五、位置编码 六、总结…

数组双指针经典习题

合并两个有序数组 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1m-1,p2n-1;int p3nums1.length-1;while(p1>0&&p2>0){//放完一个数组if(nums1[p1]>nums2[p2]){nums1[p3--]nums1[p1];p1--;}else{nums1[p3--]nums2[p2];p…

iOS调整collectionViewCell顺序

效果图 原理 就是设置collectionView调整顺序的代理方法&#xff0c;这里要注意一点 调整过代理方法之后&#xff0c;一定要修改数据源&#xff0c;否则导致错乱。 还有就是在collectionView上面添加一个长按手势&#xff0c;在长按手势的不同阶段&#xff0c;调用collectionV…

第18篇 Intel FPGA Monitor Program的使用<一>

Q&#xff1a;Intel FPGA Monitor Program开发工具可以支持Terasic的FPGA开发板使用吗&#xff1f; A&#xff1a;Intel FPGA Monitor Program 是Intel提供的适用于 ARM* Cortex*-A9 处理器和 Nios II 处理器的完整软件开发环境&#xff0c;它包括编译工具以及完整的调试功能&…

全国电力变压器数据

全国共10330个电力变压器 属性部分并不是很全&#xff0c;比如说一次电压&#xff0c;二次电压只有200条是全的 不过以我做电力采集时的经验&#xff0c;其实变压器的数量和位置是最难采集的数据&#xff0c;反而电压、电流、功率这些专业数据可以直接找设备台账补充或利用移动…

log4j日志打印导致OOM问题

一、背景 某天压测&#xff0c;QPS压到一定值后机器就开始重启&#xff0c;出现OOM&#xff0c;好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地&#xff0c;打开Java sdk bin目录下的jvisualvm工具&a…

35、matlab设置字体、查看工具包版本、窗口默认布局和程序发布

1、matlab设置字体 1&#xff09;找到预设并点击预设 2&#xff09;设置流程&#xff1a;字体——>自定义——>编辑器——>选择字体及格式——>确定 如图序号所示 2、matlab查看工具包版本&#xff1a;ver命令 1&#xff09;命令行窗口输入命令 即可查看工具包…

如何使用前端表格控件实现数据更新?

前言 小编之前分享过一篇文章叫《如何使用前端表格控件实现多数据源整合&#xff1f;》。今天&#xff0c;继续为大家介绍如何使用前端表格控件来更新已连接的数据源信息。 环境准备 SpreadJS在线表格编辑器&#xff1a; SpreadJS 前端表格控件新版本新增了一款报表插件&am…

Python altair库:轻松打造高颜值数据可视化图表

更多Python学习内容&#xff1a;ipengtao.com Altair是一个基于Vega和Vega-Lite构建的Python数据可视化库。它提供了一个简单且直观的API&#xff0c;能够生成具有交互性的统计图表。Altair的设计理念是通过声明式的语法定义图表&#xff0c;从而简化了复杂图表的创建过程。本文…

VUE脚手架更新

用vue命令创建命令时发现提示需要更新vue-cli 卸载原脚手架 npm uninstall vue-cli -g 升级 npm install -g vue/cli 检查版本 vue -V 注意是大写的v