用flask Flask-RESTful,实现RESTful API
简介:#
自从Roy Fielding博士在2000年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。
如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。
REST就是一种设计API的模式。最常用的数据格式是JSON。
比方说下载最流行的AI技术,百度这个流氓还是开放了API接口,供我们有限度的免费调用。
这个使用的就是API。
学习RESTful API,对我们以后使用别人开放的API又很大的好处
我们一起来看看RESTFul API有哪些特点:
- 基于“资源”,数据也好、服务也好,在RESTFul设计里一切都是资源。
- 无状态。一次调用一般就会返回结果,不存在类似于“打开连接-访问数据-关闭连接”这种依赖于上一次调用的情况。
- URL中通常不出现动词,只有名词
- URL语义清晰、明确
- 使用HTTP的GET、POST、DELETE、PUT来表示对于资源的增删改查
-
使用JSON不使用XML
我举个例子:
网站:/get_user?id=3
RESTFul: GET /user/3 (GET是HTTP类型)
作者:
链接:https://www.imooc.com/article/17650
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
一:使用RESTful API的好处#
1.返回的不是HTML,而是机器能直接解析的数据#
随着ajax的流行,API返回数据,而不是HTML页面,数据交互量减少,用户体验会好。
前后台分离,后台更多的进行数据处理,前台对数据进行渲染。
2.直接使用api可以进行CRUD,增删改查#
一个标准的API,会有4个接口,get,put,post,delete,对应你的请求类型。就是WEB获取页面,上传表单,上传文件…………
增删改查,结构清晰
3.使用token令牌来进行用户权限认证,比cookie更安全#
虽然我还没明白这是什么意思,但是cookie确实是我爬网站时使用最多的伪造渠道。
4.越来越多的开放平台,开始使用api接口#
我们学习了如果构建API,那么也就熟悉了解了如何使用,对以后使用开放API,又很大的帮助。
也许某天,我们自己写的程序,也会开放一些API接口给大家用,那也应该符合RESTful API标准。
二:快速入门#
1.官网#
其实这个不是官网,但是是中文文档。
http://www.pythondoc.com/Flask-RESTful/quickstart.html
2.安装#
安装 Flask 和 Flask-RESTful。
本人测试环境如下:
Flask==1.0.2
Flask-HTTPAuth==3.2.4
Flask-RESTful==0.3.6
requests==2.19.1
python 3.6.3
windows 10 x64
3.无脑测试#
快速入门当中的代码貌似和我现在的版本不太匹配了。
下面这个是我改好的。
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)
这个代码跑起来看看访问:http://127.0.0.1:5000,返回值是
{ "hello": "world" }
而且我们没有注册首页路由,用了api.add_resource.。
返回的是一个JSON格式字符串。
三:用requests库深入测试#
1.get就是我们日常浏览器访问的方式#
没错,就是爬虫用的requests库。
from requests import get,put,post,delete #测试get t1=get('http://127.0.0.1:5000') print(t1) #返回码 print(t1.text) #内容4
返回值:
<Response [200]> { "hello": "world" }
返回码200,返回的text是json数据
2.put#
from requests import get,put,post,delete #测试get t1=put('http://127.0.0.1:5000') print(t1) #返回码 print(t1.text) #内容
返回值:
<Response [405]> { "message": "The method is not allowed for the requested URL." }
还没写这个方法
我们没写都会有正确的信息返回,还是用库吧,比自己写方便多了。
主要是更加标准化。
四:完整代码#
1.官方文档的完整代码示例#
from flask import Flask from flask_restful import reqparse, abort, Api, Resource app = Flask(__name__) api = Api(app) TODOS = { 'todo1': {'task': 'build an API'}, 'todo2': {'task': '?????'}, 'todo3': {'task': 'profit!'}, } def abort_if_todo_doesnt_exist(todo_id): if todo_id not in TODOS: abort(404, message="Todo {} doesn't exist".format(todo_id)) parser = reqparse.RequestParser() parser.add_argument('task', type=str) # Todo # show a single todo item and lets you delete them class Todo(Resource): def get(self, todo_id): abort_if_todo_doesnt_exist(todo_id) return TODOS[todo_id] def delete(self, todo_id): abort_if_todo_doesnt_exist(todo_id) del TODOS[todo_id] return '', 204 def put(self, todo_id): args = parser.parse_args() task = {'task': args['task']} TODOS[todo_id] = task return task, 201 # TodoList # shows a list of all todos, and lets you POST to add new tasks class TodoList(Resource): def get(self): return TODOS def post(self): args = parser.parse_args() todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1 todo_id = 'todo%i' % todo_id TODOS[todo_id] = {'task': args['task']} return TODOS[todo_id], 201 ## ## Actually setup the Api resource routing here ## api.add_resource(TodoList, '/todos') api.add_resource(Todo, '/todos/<todo_id>') if __name__ == '__main__': app.run(debug=True)
2.深入测试#
from requests import get,put,post,delete t1=get('http://127.0.0.1:5000/todos') #测试get 全部 print(t1) #返回码 print(t1.text) #内容 t2=get('http://127.0.0.1:5000/todos/todo1') #测试获取一条 print(t2) print(t2.text) t3=put('http://127.0.0.1:5000/todos/todo1',data={'task':'jack test'}) #测试修改一条,todo1 print(t3) print(t3.text) t4=get('http://127.0.0.1:5000/todos/todo1') #重新获取todo1 print(t4) print(t4.text) t5=delete('http://127.0.0.1:5000/todos/todo1') #删除一个 todo1 print(t5) print(t5.text) t6=get('http://127.0.0.1:5000/todos') #重新获取全部 print(t6) print(t6.text) t7=post('http://127.0.0.1:5000/todos',data={'task':'new line'}) print(t7) print(t7.text) #测试创建一个 t8=get('http://127.0.0.1:5000/todos') print(t8) print(t8.text)
3.总结#
测试代码中使用了嵌套字典来进行测试,换成数据库,应该会吧?
五:#
1.#
2.#
3.#
六:#
1.#
2.#
3.#
七:#
1.#
2.#
3.#
八:#
1.#
2.#
3.#
九:#
1.#
2.#
3.#
十:#
1.#
2.#
3.#
作者:上官飞鸿
出处:https://www.cnblogs.com/jackadam/p/9208439.html
版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现