Python中Flask-RESTful编写API接口(小白入门)
作者:Alien-Hu 发布时间:2023-02-07 10:47:46
1.API接口:hello world 案例
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
2.API接口:Resource充当路由的角色
官方文档的说法:
Flask-RESTful 提供的最主要的基础就是资源(resources)。资源(Resources)是构建在 Flask 可拔插视图 之上,只要在你的资源(resource)上定义方法就能够容易地访问多个 HTTP 方法.
其实就是想表达,在资源路由上(resources)定义多个方法(get,post,put等),就可以实现多种效果
from flask import Flask, request
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
todos = {}
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}
def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]}
api.add_resource(TodoSimple, '/<string:todo_id>')
if __name__ == '__main__':
app.run(debug=True)
解释:
(1)TodoSimple类定义了2种方法,最终地址/string:todo_id'下面,就可以实现2种请求方法
(2)add_resource方法中第一个参数:视图函数名;第二个参数:路由的具体地址,以及string:todo_id代表传递的是一个字符串,且是必要参数。
(3)request.form[‘data']获取request里面,form表单的key为data的参数,如果request里面,没有data参数,那报错。如果有包含data的多个参数,那也只会取data这一个参数
step1:为字典todos定义参数,key为todo1
step2:获取todos里面的todo1的参数
step3:更新老的数据,多传递其他参数
step4:获取最新的参数:
step5:不传递data参数,查看报错情况:
3.API接口:endpoint(端口)的理解:
这个问题详情可以参考如下博文,已经解释很详细了:
https://www.jb51.net/article/176173.htm
简单理解是:
url通过endpoint来去查找视图函数(通常endpoint的名字与视图函数名一致),但是如果不一致的时候,就需要有针对性的指定某个视图函数去执行,也或者多个蓝图里面有一样的视图函数的场景下,需要指定具体的endpoint
4.API接口:参数解析
官方文档:
(1)尽管 Flask 能够简单地访问请求数据(比如查询字符串或者 POST 表单编码的数据),验证表单数据仍然很痛苦。Flask-RESTful 内置了支持验证请求数据,它使用了一个类似 argparse 的库。
(2)需要注意地是与 argparse 模块不同,reqparse.RequestParser.parse_args() 返回一个 Python 字典而不是一个自定义的数据结构。
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('task', type=str)
parser.add_argument('name', type=str)
# 获取 & 更新
class Get_Modify(Resource):
def post(self):
args = parser.parse_args()
print(args)
return args, 201
api.add_resource(Get_Modify, '/get_modify')
if __name__ == '__main__':
app.run(debug=True)
step1:从form表单里面获取定义的参数
解释:
即使传递其他参数,最终也只会读取定义的2个参数的值
通过如上代码说明:reqparse.RequestParser.parse_args(),即如上的args可以获取到request的form表单的参数,最终是一个字典
5.API接口:案例一(在form表单里面传递参数)
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
Tasks = {
't1': {'task': 'eat an app'},
't2': {'task': 'play football'},
't3': {'task': 'watching TV'},
}
def abort_if_todo_doesnt_exist(t_id):
if t_id not in Tasks:
abort(404, message="Todo {} doesn't exist".format(t_id))
parser = reqparse.RequestParser()
parser.add_argument('task', type=str)
# 获取 & 更新
class Get_Modify(Resource):
def get(self):
return Tasks
def post(self):
args = parser.parse_args()
t_id = int(max(Tasks.keys()).lstrip('t')) + 1
t_id = 't%i' % t_id
Tasks[t_id] = {'task': args['task']}
return Tasks[t_id], 201
# 设置每个视图函数的访问格式
api.add_resource(Get_Modify, '/get_modify')
if __name__ == '__main__':
app.run(debug=True)
解释:
(1)如上的函数,get是获取总的列表Tasks
(2)post是添加最新的一个key的值,且key的值是以“t”开头,数字自增的一种形式
(3)max(Tasks.keys())这个可以获取到Tasks列表里面,索引最大的key值,在没添加的时候,索引最大为t3
(4)x_string.lstrip(‘t'),这个可以截取x_string字符串里面以't'开始的剩余字符串。例如t3最终得到3,最终int(max(Tasks.keys()).lstrip(‘t')) + 1这一行的意思是,得到列表最大的一个key的索引,然后自增到下一个。
(5)在希望在form表单里面传递参数,需要在函数里面,使用args = parser.parse_args()接收传递的参数,具体key值通过add_argument函数设置
step1:第一次get请求,获取原始的Tasks列表
step2:第二次post请求,添加value的值为studying,且第三次get请求,查看最新Tasks
6.API接口:案例二(通过url里面的参数作为查询的参数)
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
Tasks = {
't1': {'task': 'eat an app'},
't2': {'task': 'play football'},
't3': {'task': 'watching TV'},
}
def abort_if_todo_doesnt_exist(t_id):
if t_id not in Tasks:
abort(404, message="Todo {} doesn't exist".format(t_id))
parser = reqparse.RequestParser()
parser.add_argument('task', type=str)
# 更新 & 删除 任务
class Updata_Delete(Resource):
def get(self, t_id): # 根据t_id获取对应的value
abort_if_todo_doesnt_exist(t_id)
return Tasks[t_id]
def delete(self, t_id): # 根据t_id删除对应的value
abort_if_todo_doesnt_exist(t_id)
del Tasks[t_id]
return 'delete success', 204
def post(self, t_id): # 判断t_id是否存在,并返回Tasks整个列表
abort_if_todo_doesnt_exist(t_id)
return Tasks,201
def put(self, t_id): # 根据t_id添加对应的value,并返回所有值
args = parser.parse_args()
task = {'task': args['task']}
Tasks[t_id] = task
return Tasks, 201
api.add_resource(Updata_Delete, '/update_delete/<t_id>')
if __name__ == '__main__':
app.run(debug=True)
step1:查看Tasks完整信息
step2:添加信息key值为:t5,内容为:studying
step3:查看t5值的情况
step4:删除t1的值,然后查看Tasks的完整信息
解释:
(1)通过url传递参数,给视图函数,这种方式一般用在get请求,post请求通过form表单形式比较实用
(2)通过url传递参数,需要定义函数时候,使用形参t_id,且在使用add_resource()函数的使用,url参数形式最后添加<t_id>变量,例如'/update_delete/<t_id>'这个形式。
(3)delete这个函数,最终执行删除是成功的,但是最终并没有返回return的字符串"delete success",具体原因不详,可能是用法不对,后续再更新中说明.
(return ‘delete success', 204 将 204去掉即可)
来源:https://blog.csdn.net/chenmozhe22/article/details/82347813
猜你喜欢
- type PipeWritertype PipeWriter struct { // contains
- 思路:创建文件时,先检查是否有同名文件(使用os.path.isfile),如果有,则在文件名后加上编号n来创建。关键点:1. 使用os.p
- 对文本类文件(*.txt;*.html;*.doc;等等),图片类文件(*.jpg;*.gif等等)直接点击链接时会在浏览器打开,而无法出现
- 八卦是种优良品质,特别是用在技术上时。来看几个Reset CSS的八卦问题吧:你知道世界上第一份reset.css在哪么?*&nb
- 参数strSQL 要导出的SQL查询语句strFields 字段名称列表,如果为空字符,则使用SQL语句中的字段名用法示例:1:export
- 我们通常会通过单击按钮的操作,将定义好的内容直接复制到剪贴板对于用户来说点了按钮直接【Ctrl】+【V】就可以了。其实该功能的核心原理就是用
- 如下所示:import cv2import mathimport numpy as npdef move(img): height, wid
- 列表是什么?列表由一系列特定顺序排列的元素组成,你可以创建包含字母表中的所有字母、数字0~9、所有家庭成员姓名的列表等等,也可以将任何东西放
- 什么是命令行参数?命令行参数是在运行时给予程序/脚本的标志。它们包含我们程序的附加信息,以便它可以执行。并非所有程序都有命令行参数,因为并非
- 虽然今年名义上已经不再管人了,但也不得不掺和进很多人事,这里想简单说说,即使不能帮助这个行业的从业者规划职业道路,也算是把之前摸过的路小结一
- 在之前文章给大家分享后不久,就有位小伙伴跟小编说在用scrapy搭建python爬虫中出现错误了。一开始的时候小编也没有看出哪里有问题,好在
- 本文实例讲述了PHP中使用addslashes函数转义的安全性原理分析。分享给大家供大家参考。具体分析如下:先来看一下ECshop中adds
- 第一次见到《Web标准和SEO应用实践》是在我们UCD书友会《设计沟通十器》新书发布现场,机械工业出版社的朋友还带了很多相关新书过来,当时本
- 一、基本结构语句一)、条件语句age = int(input("请输入你家狗狗的年龄: "))print("&
- 用HZHOST实用工具集的服务器安全设置里安装了MSSQL安全配置,现在SQL2000还原不了数据库了,从还原选定设备浏览文件夹时出现&qu
- 前言本文主要给大家介绍了关于golang分页算法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧示例代码如下://
- 1.查看Anaconda中有哪些虚拟环境及所在目录:在桌面搜索框中输入Anaconda Prompt并打开输入命令conda env lis
- 首先打击我的就是rpm安装,它告诉我发现了Mysql版本冲突,安装无法继续。我用rpm -q 查询后,想通过rpm -e 来删除系统自带的版
- 1. dataloader() 初始化函数def __init__(self, dataset, batch_size=1, shuffle
- 经常看到说正则的文章,但说的只是方法,却很少有说以下几个基本概念: 1.贪婪:+,*,?,{m,n}等默认是贪婪匹配,即尽可能多匹配,也叫最