Python中Flask-RESTful编写API接口(小白入门)
1.API接口:helloworld案例
fromflaskimportFlask
fromflask_restfulimportApi,Resource
app=Flask(__name__)
api=Api(app)
classHelloWorld(Resource):
defget(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等),就可以实现多种效果
fromflaskimportFlask,request
fromflask_restfulimportApi,Resource
app=Flask(__name__)
api=Api(app)
todos={}
classTodoSimple(Resource):
defget(self,todo_id):
return{todo_id:todos[todo_id]}
defput(self,todo_id):
todos[todo_id]=request.form['data']
return{todo_id:todos[todo_id]}
api.add_resource(TodoSimple,'/')
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://www.nhooo.com/article/176173.htm
简单理解是:
url通过endpoint来去查找视图函数(通常endpoint的名字与视图函数名一致),但是如果不一致的时候,就需要有针对性的指定某个视图函数去执行,也或者多个蓝图里面有一样的视图函数的场景下,需要指定具体的endpoint
4.API接口:参数解析
官方文档:
(1)尽管Flask能够简单地访问请求数据(比如查询字符串或者POST表单编码的数据),验证表单数据仍然很痛苦。Flask-RESTful内置了支持验证请求数据,它使用了一个类似argparse的库。
(2)需要注意地是与argparse模块不同,reqparse.RequestParser.parse_args()返回一个Python字典而不是一个自定义的数据结构。
fromflaskimportFlask
fromflask_restfulimportreqparse,abort,Api,Resource
app=Flask(__name__)
api=Api(app)
parser=reqparse.RequestParser()
parser.add_argument('task',type=str)
parser.add_argument('name',type=str)
#获取&更新
classGet_Modify(Resource):
defpost(self):
args=parser.parse_args()
print(args)
returnargs,201
api.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表单里面传递参数)
fromflaskimportFlask
fromflask_restfulimportreqparse,abort,Api,Resource
app=Flask(__name__)
api=Api(app)
Tasks={
't1':{'task':'eatanapp'},
't2':{'task':'playfootball'},
't3':{'task':'watchingTV'},
}
defabort_if_todo_doesnt_exist(t_id):
ift_idnotinTasks:
abort(404,message="Todo{}doesn'texist".format(t_id))
parser=reqparse.RequestParser()
parser.add_argument('task',type=str)
#获取&更新
classGet_Modify(Resource):
defget(self):
returnTasks
defpost(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']}
returnTasks[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里面的参数作为查询的参数)
fromflaskimportFlask
fromflask_restfulimportreqparse,abort,Api,Resource
app=Flask(__name__)
api=Api(app)
Tasks={
't1':{'task':'eatanapp'},
't2':{'task':'playfootball'},
't3':{'task':'watchingTV'},
}
defabort_if_todo_doesnt_exist(t_id):
ift_idnotinTasks:
abort(404,message="Todo{}doesn'texist".format(t_id))
parser=reqparse.RequestParser()
parser.add_argument('task',type=str)
#更新&删除任务
classUpdata_Delete(Resource):
defget(self,t_id):#根据t_id获取对应的value
abort_if_todo_doesnt_exist(t_id)
returnTasks[t_id]
defdelete(self,t_id):#根据t_id删除对应的value
abort_if_todo_doesnt_exist(t_id)
delTasks[t_id]
return'deletesuccess',204
defpost(self,t_id):#判断t_id是否存在,并返回Tasks整个列表
abort_if_todo_doesnt_exist(t_id)
returnTasks,201
defput(self,t_id):#根据t_id添加对应的value,并返回所有值
args=parser.parse_args()
task={'task':args['task']}
Tasks[t_id]=task
returnTasks,201
api.add_resource(Updata_Delete,'/update_delete/')
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参数形式最后添加
(3)delete这个函数,最终执行删除是成功的,但是最终并没有返回return的字符串"deletesuccess",具体原因不详,可能是用法不对,后续再更新中说明.
(return‘deletesuccess',204将204去掉即可)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。