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中字符串格式化str.format的详细介绍
Feb 17 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
有关Python的22个编程技巧
Aug 29 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
Python3 Click模块的使用方法详解
Feb 12 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
Python接口测试环境搭建过程详解
Jun 29 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
python获取淘宝服务器时间的代码示例
Apr 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
极典R601SW收音机
2021/03/02 无线电
自定义php类(查找/修改)xml文档
2013/03/26 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python random模块用法解析及简单示例
2017/12/18 Python
python实现决策树
2017/12/21 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
python 实现表情识别
2020/11/21 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
银行优秀员工事迹
2014/02/06 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
学校推普周活动总结
2015/05/07 职场文书
Python中Cookies导出某站用户数据的方法
2021/05/17 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript