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获取豆瓣电影简介代码分享
Jan 16 Python
Python字符串转换成浮点数函数分享
Jul 24 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python编程中的文件操作攻略
Oct 16 Python
Python中防止sql注入的方法详解
Feb 25 Python
Python数据结构之单链表详解
Sep 12 Python
pandas object格式转float64格式的方法
Apr 10 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
python 导入数据及作图的实现
Dec 03 Python
python二维键值数组生成转json的例子
Dec 06 Python
使用Python 自动生成 Word 文档的教程
Feb 13 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
joomla组件开发入门教程
2016/05/04 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python实现简单登陆流程的方法
2018/04/22 Python
Python格式化输出%s和%d
2018/05/07 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
python psutil监控进程实例
2019/12/17 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
pycharm的python_stubs问题
2020/04/08 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
硕士研究生个人求职信
2013/12/04 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书