侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   222

1.API接口:hello world 案例

from flask import Flaskfrom flask_restful import Api, Resourceapp = 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)

2.API接口:Resource充当路由的角色

官方文档的说法:
Flask-RESTful 提供的最主要的基础就是资源(resources)。资源(Resources)是构建在 Flask 可拔插视图 之上,只要在你的资源(resource)上定义方法就能够容易地访问多个 HTTP 方法.

其实就是想表达,在资源路由上(resources)定义多个方法(get,post,put等),就可以实现多种效果

from flask import Flask, requestfrom flask_restful import Api, Resourceapp = 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

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

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

step4:获取最新的参数:

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

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

这个问题详情可以参考如下博文,已经解释很详细了:
https:///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 Flaskfrom flask_restful import reqparse, abort, Api, Resourceapp = 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, 201api.add_resource(Get_Modify, '/get_modify')if __name__ == '__main__': app.run(debug=True)

step1:从form表单里面获取定义的参数

解释:
即使传递其他参数,最终也只会读取定义的2个参数的值
通过如上代码说明:reqparse.RequestParser.parse_args(),即如上的args可以获取到request的form表单的参数,最终是一个字典

5.API接口:案例一(在form表单里面传递参数)

from flask import Flaskfrom flask_restful import reqparse, abort, Api, Resourceapp = 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列表

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

6.API接口:案例二(通过url里面的参数作为查询的参数)

from flask import Flaskfrom flask_restful import reqparse, abort, Api, Resourceapp = 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, 201api.add_resource(Updata_Delete, '/update_delete/<t_id>')if __name__ == '__main__': app.run(debug=True)

step1:查看Tasks完整信息

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

step3:查看t5值的情况

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

解释:
(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调用json模块
    下一条:
    Python zip函数打包元素实例解析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客