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读取mp3中ID3信息的方法
Mar 05 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
简单实现python数独游戏
Mar 30 Python
在windows下Python打印彩色字体的方法
May 15 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
Python读取txt某几列绘图的方法
Oct 14 Python
深入理解Django-Signals信号量
Feb 19 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
matplotlib更改窗口图标的方法示例
Feb 03 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
CI框架常用方法小结
2016/05/17 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP学习笔记之session
2018/05/06 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
vue3.0 上手体验
2020/09/21 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
python如何实现数据的线性拟合
2019/07/19 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
工艺员岗位职责
2014/02/11 职场文书
学习经验演讲稿
2014/05/10 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
教育教学读书笔记
2015/07/02 职场文书
网络营销实训总结
2015/08/03 职场文书
2016年情人节问候语
2015/11/11 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
JavaScript实现栈结构详细过程
2021/12/06 Javascript