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 图片验证码代码
Dec 07 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
python修改操作系统时间的方法
May 18 Python
学习python类方法与对象方法
Mar 15 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
python 系统调用的实例详解
Jul 11 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
深入分析python中整型不会溢出问题
Jun 18 Python
python 输入一个数n,求n个数求乘或求和的实例
Nov 13 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
python对execl 处理操作代码
Jun 22 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/06 冲泡冲煮
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python列表与元组详解实例
2013/11/01 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python 格式化输出百分号的方法
2019/01/20 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
工伤事故赔偿协议书
2014/04/15 职场文书
授权委托书
2014/07/31 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL