python post参数传递不成功_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 Flaskfrom flask_restful import Resource, Api, reqparseimport pandas as pdimport astapp = Flask(__name__)api = Api(app)
3.端点
正如上文提到的,我们的API有两个端点:用户和位置。
假设我们的API的结果位于www.api.com网站,则将在www.api.com/users提供与Users类的通信,并在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): #方法 pass class Locations(Resource): #方法 pass api.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') # 读取 CSV data = data.to_dict() # 将数据帧转换为字典 return {'data': data}, 200 # 返回数据和200 OK代码
然后,我们可以运行脚本来初始化我们的API,打开Postman并将GET请求发送到我们的本地主机地址(通常为http://127.0.0.1:5000),这是我们的API入口点。
如何将GET请求发送到我们的API
要将GET请求发送到Postman中的API,我们:
- 从下拉列表中选择GET;
- 输入我们的API实例+ / users的入口点(端点);
- 点击发送;
- 检查我们的API返回的状态码(我们应该看到200 OK);
- 查看我们的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': [[]] }) # 读取CSV data = pd.read_csv('users.csv') # 添加新提供的值 data = data.append(new_data, ignore_index=True) # 保存并返回CSV data.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未经授权的代码。
... # 读取 CSV data = pd.read_csv('users.csv') if args['userId'] in data['userId']: return { 'message': f"'{args['userId']}' already exists." }, 401 else: # 创建包含新值的新数据帧 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) # 返回并保存CSV return {'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() # 将参数解析为字典 # 读取 CSV data = 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']) # 保存并返回CSV data.to_csv('users.csv', index=False) # 返回数据和200 OK return {'data': data.to_dict()}, 200 else: # 否则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)
python post参数传递不成功_Python中的API构建指南:在Flask中进行API开发相关推荐
- python运行代码不成功_python的运行时易犯错误,你中招了没?快来学习了
小编话不多说,上干货!!欢迎分享跟多python知识,转发++关注,帮助跟多学习的程序猿!!! 1)忘记在 if , elif, else, for, while, class,def声明末尾添加 : ...
- python数据框循环生成_python - 如何在 Pandas 的for循环迭代中创建多个数据框?
我需要在熊猫中创建一个函数,该函数将单个数据框作为输入,并根据特定条件返回多个数据框作为输出. (请检查下面的示例以了解情况).我很难弄清楚如何做.我需要一些专家的编码建议. 范例1: 输入= 100 ...
- python部署到hadoop上_python实现mapreduce(2)——在hadoop中执行
目的:将python实现mapreduce(1)中的python脚本部署到hadoop上,实现mapreduce. 1. 修改脚本执行权限 [tianyc@TeletekHbase ~]$ which ...
- python网络爬虫系列教程_Python网络爬虫系列教程连载 ----长期更新中,敬请关注!...
感谢大家长期对Python爱好者社区的支持,后期Python爱好者社区推出Python网络爬虫系列教程.欢迎大家关注.以下系列教程大纲,欢迎大家补充.视频长期连载更新中 --------------- ...
- python怎么去掉视频字幕_python实现去除下载电影和电视剧文件名中的多余字符的方法...
本文实例讲述了python实现去除下载电影和电视剧文件名中的多余字符的方法,是一个非常实用的技巧,分享给大家供大家参考.具体如下: 有时候我们讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样) ...
- python遍历txt每一行_python读取TXT每行,并存到LIST中的方法
python读取TXT每行,并存到LIST中的方法 更新时间:2018年10月26日 10:58:52 作者:宁不凡 今天小编就为大家分享一篇python读取TXT每行,并存到LIST中的方法,具有很 ...
- python installer 在 mac 运行_python – 如何在Mac OS X 10.7中的virtualenv中安装PyAudio
我努力了 easy_install pyaudio 它不起作用我得到以下内容: Searching for pyaudio Reading http://pypi.python.org/simple/ ...
- python判断邮件发送成功_python发送邮件判断是否被打开
这也是接着 上一篇 文章的那个面试题,不过判断邮件是否被打开是与使用什么语言无关的,只是一种解决思路. 判断邮件是否被打开,其实就要了解打开邮件的过程发生了什么.除了目前大部分邮箱提供的已读回执之外, ...
- python怎么导入数据包_python – Scapy:如何在现有数据包中插入新层(802.1q)?
为了找到答案,我看了一下 Scapy: Inserting a new layer and logging issues,这真的很有用,但包含了一些内容. 我根据引用的问题(add-dot1q_pca ...
最新文章
- vue-cli脚手架(框架)
- [Tkinter 教程] 布局管理 (Pack Place Grid)
- python语法手册chm-python3.5.2官方帮助文档 参考手册(CHM版)
- python quirk
- 【Python】一道题吃够Python语法糖
- socket网络编程——TCP编程流程及端口号占用问题
- 怎么关闭或者卸载ivanti_电脑软件卸载不了怎么办,教您解决电脑软件无法卸载方法技巧...
- 监听手指是否离开屏幕android_Flutter事件监听
- JavaScript ES2019的新增功能
- 正则表达式 以字符串开头_干货-Shell编程之正则表达式
- LIS(最长上升子序列)的 DP 与 (贪心+二分) 两种解法
- Java程序开发的基本流程是什么样的?
- win10台式机,耳机插入没有声音
- Convex optimization 1 --- convex set
- 嵌入式开发板设置IP
- 重装Windows10后调节亮度无效,一直是最亮
- (小白鼠喝药问题)1000瓶药水,其中有一瓶是有毒的,如何找出有毒的药水?
- linux驱动开发简单示例
- 解决硬盘自动休眠问题
- 苹果cms V10添加修改播放器教程