Python中Flask-RESTful编写API接口(小白入门)


Posted in Python onDecember 11, 2019

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)

Python中Flask-RESTful编写API接口(小白入门)

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

Python中Flask-RESTful编写API接口(小白入门)

step2:获取todos里面的todo1的参数

Python中Flask-RESTful编写API接口(小白入门)

step3:更新老的数据,多传递其他参数

Python中Flask-RESTful编写API接口(小白入门)

step4:获取最新的参数:

Python中Flask-RESTful编写API接口(小白入门)

step5:不传递data参数,查看报错情况:

Python中Flask-RESTful编写API接口(小白入门)

3.API接口:endpoint(端口)的理解:

这个问题详情可以参考如下博文,已经解释很详细了:
https://3water.com/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表单里面获取定义的参数

Python中Flask-RESTful编写API接口(小白入门)

解释:
即使传递其他参数,最终也只会读取定义的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列表

Python中Flask-RESTful编写API接口(小白入门)

step2:第二次post请求,添加value的值为studying,且第三次get请求,查看最新Tasks

Python中Flask-RESTful编写API接口(小白入门)

Python中Flask-RESTful编写API接口(小白入门)

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完整信息

Python中Flask-RESTful编写API接口(小白入门)

step2:添加信息key值为:t5,内容为:studying

Python中Flask-RESTful编写API接口(小白入门)

step3:查看t5值的情况

Python中Flask-RESTful编写API接口(小白入门)

step4:删除t1的值,然后查看Tasks的完整信息

Python中Flask-RESTful编写API接口(小白入门)

Python中Flask-RESTful编写API接口(小白入门)

解释:
(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去掉即可)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
玩转python爬虫之正则表达式
Feb 17 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
python 实现倒排索引的方法
Dec 25 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
Django CSRF认证的几种解决方案
Mar 03 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
Python中SQLite如何使用
May 27 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
Python zip函数打包元素实例解析
Dec 11 #Python
基于Python实现扑克牌面试题
Dec 11 #Python
Python如何使用argparse模块处理命令行参数
Dec 11 #Python
opencv3/C++ 平面对象识别&amp;透视变换方式
Dec 11 #Python
Python Lambda函数使用总结详解
Dec 11 #Python
Python迭代器模块itertools使用原理解析
Dec 11 #Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 #Python
You might like
法压式咖啡之制作法
2021/03/03 冲泡冲煮
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
以一段代码为实例快速入门Python2.7
2015/03/31 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
详解Python中的路径问题
2020/09/02 Python
大四本科生的自我评价
2013/12/30 职场文书
初中班主任评语
2014/04/24 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
工程售后服务方案
2014/06/08 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
刘公岛导游词
2015/02/05 职场文书
毕业酒会致辞
2015/07/29 职场文书
班委竞选稿范文
2015/11/21 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书