Python中的API构建指南:在Flask中进行API开发

原文:Python中的API构建指南:在Flask中进行API开发 - 知乎

如何实现从一个软件与另一个软件的通信交互?就像我们的APP,如何实现微信支付、苹果支付?

其实,我们只需要一个API。

API(应用程序编程接口)是一个简单的接口,它定义了可以发出的请求类型(需求/问题等)、请求的发出方式以及处理方式。

在本文中,我们将构建一个API,它允许我们向不同的端点发送一系列GET/POST/PUT/PATCH/DELETE等各种请求,并返回或修改与API连接的数据。

我们将使用Flask框架来创建我们的API,并使用Postman来对其进行测试它。本文将涵盖以下内容:

1.设置

  • 数据集
  • 初始化Flask API
  • 端点
  • 运行本地服务器

2.编写API

  • GET
  • POST
  • 401未经授权
  • PUT
  • DELETE
  • 用户类(摘要)

3.总结


设置

我们的API将包含两个端点:用户和位置。 前者将允许访问我们注册用户的详细信息,而后者将包括咖啡馆位置列表。

此处假设的用例是数百万个咖啡馆的书签应用程序,用户可以在其中打开该应用程序并为自己喜欢的咖啡馆添加书签,例如谷歌地图。

1.数据集

为了简单起见,我们将把这些数据存储在两个本地CSV文件中。

CSV文件如下所示:

用户数据

位置数据

users.csv:https://drive.google.com/file/d/12-nW-R6TEPbUzSVF8zsQtOm992TdZOqj/view?usp=sharing

locations.csv:https://drive.google.com/file/d/1ERGeiKZLNuD9K-MHd7a0Colqj_DqiMww/view?usp=sharing

2.初始化Flask API

对于Python脚本,我们需要导入模块并初始化API,如下所示:

from flask import Flask
from flask_restful import Resource, Api, reqparse
import pandas as pd
import ast
app = Flask(__name__)
api = Api(app)

3.端点

正如上文提到的,我们的API有两个端点:用户和位置。

假设我们的API的结果位于http://www.api.com网站,则将在http://www.api.com/users提供与Users类的通信,并在http://www.api.com/locations提供Locations。

为了创建端点,我们需要定义一个Python类,然后使用api.add_resource将其连接到所需的端点,如下所示:

class Users(Resource):# 方法在这里passapi.add_resource(Users, '/users')  # /users'是我们的切入点
  • Flask需要知道类是我们API的端点,因此我们将Resource与类定义一起传入。
  • 在类内部,包含了我们的HTTP方法(GET,POST,DELETE等)。
  • 最后,我们使用api.add_resource将Users类与/ users端点链接。

因为我们需要两个端点,所以我们复制了逻辑:

class Users(Resource):#方法passclass Locations(Resource):#方法passapi.add_resource(Users, '/users')  # '/users' 是我们进入用户的切入点
api.add_resource(Locations, '/locations')  #  '/ locations'是我们的位置的切入点

4.运行本地服务器

最后,在我们写出API时,还要对其进行测试!

为此,我们需要托管我们的API,我们可以在本地通过将app.run添加到脚本末尾来进行本地化,如下所示:

if __name__ == '__main__':app.run()  #运行 Flask app

当我们运行脚本时,我们会看到如下所示:

初始化本地主机服务器

设置好服务器后,如果您在使用Postman构建API的实际标准之前还没有使用过它,就可以对其进行测试。

编写API

在每个类中,我们保留HTTP方法GET,POST和DELETE。

要创建GET方法,我们使用def get(self)。POST和DELETE遵循相同的模式。

1.GET

GET方法是最简单的。我们返回存储在字典中的 users.csv 中存储的所有数据,如下所示:

class Users(Resources):def get(self):data = pd.read_csv('users.csv')  # 读取 CSVdata = data.to_dict()  # 将数据帧转换为字典return {'data': data}, 200  # 返回数据和200 OK代码

然后,我们可以运行脚本来初始化我们的API,打开Postman并将GET请求发送到我们的本地主机地址(通常为http://127.0.0.1:5000),这是我们的API入口点。

如何将GET请求发送到我们的API

要将GET请求发送到Postman中的API,我们:

  1. 从下拉列表中选择GET;
  2. 输入我们的API实例+ / users的入口点(端点);
  3. 点击发送;
  4. 检查我们的API返回的状态码(我们应该看到200 OK);
  5. 查看我们的API响应,即JSON(如字典)格式的users.csv。

2.POST

POST方法允许我们将记录添加到数据中。在这种情况下,我们将使用 usedId,name和city的参数。

这些参数作为URL参数传递到我们的API端点,如下所示:

http://127.0.0.1:5000/users?userId=abc123&name=The Rock&city=Los Angeles

我们可以指定所需的参数,然后使用reqparse解析提供的值,如下所示:

parser = reqparse.RequestParser()  # 初始化parser.add_argument('userId', required=True)  # 添加参数
parser.add_argument('name', required=True)
parser.add_argument('city', required=True)args = parser.parse_args()  # 将参数解析为字典

让我们分解一下解析器代码:

  • 使用.RequestParser()初始化解析器。
  • 使用.add_argument([arg_name],required)添加参数。请注意,required = True 表示请求中的参数是必需的。另外,我们可以添加带有 required = False 的可选参数。
  • 使用.parse_args()将参数及其值解析为Python字典。

然后,我们可以访问传递给每个参数的值,就像我们通常在字典中使用键值对一样。

将代码进行合并,为CSV添加值:

class Users(Resource):def post(self):parser = reqparse.RequestParser()  #初始化parser.add_argument('userId', required=True)  # 添加参数parser.add_argument('name', required=True)parser.add_argument('city', required=True)args = parser.parse_args()  #将参数解析为字典# 创建包含新值的新数据帧new_data = pd.DataFrame({'userId': args['userId'],'name': args['name'],'city': args['city'],'locations': [[]]})# 读取CSVdata = pd.read_csv('users.csv')# 添加新提供的值data = data.append(new_data, ignore_index=True)# 保存并返回CSVdata.to_csv('users.csv', index=False)return {'data': data.to_dict()}, 200  # 返回200 OK数据

看起来有点混乱,简单点,我们要做的就是:

  • 从URL参数args创建一行新数据new_data;
  • 将其附加到预先存在的数据;
  • 保存新合并的数据;
  • 返回数据以及200 OK状态代码。

我们通过向/ user端点发送包含userId,名称和城市参数的POST请求来创建新用户。

现在,我们可以发送POST请求来创建新用户了,是不是很简单?!

3.401未经授权

我们的代码处理POST请求,允许我们将新数据写入users.csv ,但是如果该用户已经存在怎么办?

为此,我们需要添加一个检查操作。如果 userId 已经存在,我们将向用户返回401未经授权的代码。

...# 读取 CSVdata = pd.read_csv('users.csv')if args['userId'] in data['userId']:return {'message': f"'{args['userId']}' already exists."}, 401else:# 创建包含新值的新数据帧new_data = pd.DataFrame({'userId': args['userId'],'name': args['name'],'city': args['city'],'locations': [[]]})# 添加新提供的值data = data.append(new_data, ignore_index=True)data.to_csv('users.csv', index=False)  # 返回并保存CSVreturn {'data': data.to_dict()}, 200  # 返回200 OK的数据

如果我们尝试使用用户ID“ abc123”再次发布,我们将返回以下401未经授权的状态代码和消息

回到Postman,我们可以通过尝试两次添加同一用户来测试我们的API是否正常运行。这次,The Rock收到401未经授权的响应。

4.PUT

如果我们想为用户添加咖啡馆怎么办? 我们无法使用POST,因为它会返回401未经授权的代码,这时候,我们就要用PUT了。

与POST类似,在提供的 userId 不存在的情况下,我们需要添加 if-else 逻辑。

class Users(Resource):def put(self):parser = reqparse.RequestParser()  # 初始化parser.add_argument('userId', required=True)  # 添加参数parser.add_argument('location', required=True)args = parser.parse_args()  # 将参数解析为字典# 读取 CSVdata = pd.read_csv('users.csv')if args['userId'] in list(data['userId']):#将列表字符串评估为列表data['locations'] = data['locations'].apply(lambda x: ast.literal_eval(x))# 选取用户user_data = data[data['userId'] == args['userId']]# 更新用户的位置user_data['locations'] = user_data['locations'].values[0] \.append(args['location'])# 保存并返回CSVdata.to_csv('users.csv', index=False)# 返回数据和200 OKreturn {'data': data.to_dict()}, 200else:# 否则userId不存在return {'message': f"'{args['userId']}' user not found."}, 404

除了对代码进行一些小调整之外,我们的PUT方法几乎与POST相同。

在这里,我们使用PUT方法将ID为0007的咖啡馆添加到The Rock的加标签的位置

回到Postman,我们所需的输入参数已更改。 现在,我们只需要userId和一个位置即可添加到用户添加了书签的位置。

5.DELETE

我们还可以使用DELETE方法删除记录。

此方法非常简单,我们需要指定要删除的userId,并在不存在userId的情况下添加一些if-else逻辑。

例如,如果用户 Jill 认为我们的APP没有用并且想离开,我们将发送包含她的userId的DELETE请求。

发送对userId'b2c'的DELETE请求会从我们的用户数据中删除Jill的记录

我们可以在Postman中进行测试,并且可以预期的是,我们返回的数据没有Jill的记录。如果我们想删除不存在的用户怎么办?

6.Users Class

这就是构成Users类的所有部分,可以通过我们的 /users 端点进行访问。

之后,我们仍然需要将 Locations 类放在一起。这个其他类应允许我们获取、发布、修补(更新)和删除位置。

每个位置都有一个唯一的ID,当用户为一个位置添加书签时,该唯一ID将通过PUT / users添加到其位置列表中。

这段代码与我们在Users类中编写的代码没有太大区别,在此,我们不再重复。

总结

使用Flask和Python设置API的方法非常简单。

通过学习上文,我们就有了一种易于使用的标准化方法,可以在不同接口之间进行通信交互。

在本文中,介绍了所有最常见的请求方法:GET、POST、PUT和DELETE。以及一些HTTP状态代码:200、401和404

最后,我们还学习了如何在本地托管我们的API并通过 Postman 对其进行测试,从而让我们能够快速诊断问题并确保我们的API正常运行。

总而言之,API开发对于开发人员来说,几乎是任何其他技术领域都是至关重要的技能。

--END--

上文中的所有代码,都能在GitHub上找到:https://gist.github.com/jamescalam/0b309d275999f9df26fa063602753f73

如果你对人工智能感兴趣,那么一定要关注我们!

如果喜欢本文,欢迎转发、评论、收藏~

也可以关注我们的公众号:为AI呐喊(weainahan)

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

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

相关文章

4G模组EC20 网卡udhcpc获取IP但是没有设置IP

使能网卡: ifconfig usb0 up dhcp获取ip,虽然没有报error,但是很显然没有设置进配置 获取ip命令:udhcpc -i usb0 非正常现象: 正常现象: 解决方法: (1)rootfs 创建文件夹…

Qt应用开发(基础篇)——富文本浏览器 QTextBrowser

一、前言 QTextBrowser类继承于QTextEdit,是一个具有超文本导航的富文本浏览器。 框架类 QFramehttps://blog.csdn.net/u014491932/article/details/132188655 滚屏区域基类 QAbstractScrollAreahttps://blog.csdn.net/u014491932/article/details/132245486 文…

保姆级使用vmware安装Ubuntu-server版

保姆级VMware安装Ubuntu20服务器版 文章目录 保姆级VMware安装Ubuntu20服务器版前期准备一、安装vmware二、下载Ubuntu镜像 VMware安装Ubuntu201. 启动Workstation Pro或者Workstation Player,进入软件后新建一个虚拟机2. 进入引导界面选择默认的即可3. 点击下一步即可4. 选择操…

AIGC人工智能涉及三十六职业,看看有没有你的职业(二)

文章目录 如何生成IP盲盒 设计儿童节海报 制作商用矢量插画 设计徽章 图片融合 后缀参数 Stylize 风格化 赛博朋克头像 中国风瓷娃娃 生成线稿 制作时尚音乐唱片封面 T恤图案设计-告白气球 引领时尚潮流的服装设计之旅 独一无二的包包奇迹 手机壳设计探险 如何生…

Flink源码之Checkpoint执行流程

Checkpoint完整流程如上图所示: JobMaster的CheckpointCoordinator向所有SourceTask发送RPC触发一次CheckPointSourceTask向下游广播CheckpointBarrierSouceTask完成状态快照后向JobMaster发送快照结果非SouceTask在Barrier对齐后完成状态快照向JobMaster发送快照结…

Linux:权限

目录 一、shell运行原理 二、权限 1.权限的概念 2.文件访问权限的相关设置方法 三、常见的权限问题 1.目录权限 2.umsk(权限掩码) 3.粘滞位 一、shell运行原理 1.为什么我们不是直接访问操作系统? ”人“不善于直接使用操作系统如果让人直接访问操作系统&a…

【网络安全】防火墙知识点全面图解(三)

本系列文章包含: 【网络安全】防火墙知识点全面图解(一)【网络安全】防火墙知识点全面图解(二)【网络安全】防火墙知识点全面图解(三) 防火墙知识点全面图解(三) 39、什…

vscode 与 C++

序 具体流程的话,官方文档里都有的:C programming with Visual Studio Code 浏览器下载一个mingw64,解压,配置环境变量vscode里安装c相关的插件没了 第一步只看文字,可能有点抽象,相关视频: …

git介绍+集成到IDEA中+使用gitee

目录 git介绍 本地工作流程 IDEA集git 添加到暂存区 添加到本地仓库 gitee使用 添加到远程仓库 git介绍 git是一个开源的分布式版本控制工具,效率高。可以记录历史代码,多人代码共享 知识小点: 集中式版本控制:使用中央存…

RabbitMQ集群搭建和测试总结_亲测

RabbiMQ简介 RabbitMQ是用Erlang开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。 RabbitMQ模式 RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…

【力扣每日一题】2023.8.26 汇总区间

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个有序数组,让我们把数组内的元素汇总区间,也就是说有一串数字是连续的,比如是 1 2 3 4…

空时自适应处理用于机载雷达——元素空间空时自适应处理(Matla代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Spring Cloud Alibaba-Sentinel-Sentinel入门

1 什么是Sentinel Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里…

使用Java开发Jmeter自定义取样器(Sampler)插件

文章目录 1、Jmeter自定义取样器扩展类2、SpringBoot服务器端http测试例子3、自定义取样器实现3.1、默认界面的AbstractJavaSamplerClient扩展实现3.2、自定义界面的AbstractSamplerGui扩展实现 3、自定义取样器运行效果3.1、AbstractJavaSamplerClient运行效果3.2、AbstractSa…

工厂生产作业流程合规检测

工厂生产作业流程合规检测系统通过yolov7网络模型算法,工厂生产作业流程合规检测对作业人员的操作行为进行全面监测,通过图像识别算法和数据分析,对人员的操作动作、工具使用、安全防护等方面进行检测和评估,能够实时监测工人的操…

9.2 互补功率放大电路

目前使用最广泛的是无输出变压器的功率放大电路(OTL 电路)和无输出电容的功率放大电路(OCL 电路)。 一、OCL 电路的组成及工作原理 为了消除图9.1.5所示的基本 OCL 电路所产生的交越失真,应当设置合适的静态工作点&a…

YOLOv5算法改进(7)— 添加SimAM注意力机制

前言:Hello大家好,我是小哥谈。SimAM(Similarity-based Attention Mechanism)是一种基于相似度的注意力机制,它的原理是通过计算查询向量与每个键向量之间的相似度,从而确定每个键向量对于查询向量的重要性…

开始MySQL之路——MySQL约束概述详解

MySQL约束 create table [if not exists] 表名(字段名1 类型[(宽度)] [约束条件] [comment 字段说明],字段名2 类型[(宽度)] [约束条件] [comment 字段说明],字段名3 类型[(宽度)] [约束条件] [comment 字段说明] )[表的一些设置]; 概念 约束英文:constraint 约束实…

vscode | 开发神器vscode自定义用户代码片段

目录 一、增加二、删除三、语法四、变量 一、增加 点击:左下角设置齿轮按钮——>用户代码片段 点击:新建全局代码片段文件 输入文件名 会出现如下界面 配置以下语句 "cls": {"scope": "javascript,typescript",…

Linux学习之Ubuntu 20.04在github下载源码安装Openresty 1.19.3.1

参考的博文:《在 Ubuntu 上使用源码安装 OpenResty》 《OpenResty 安装安装详解-Ubuntu》 《Linux学习之CentOS 7源码安装openresty》 https://openresty.org/en/download.html是官网下载网址,页面往下拉有下载的链接。 https://github.com/openresty…