Flask中的RESTFul
RESTFul
1、什么是RESTFul?
1.1 简介
REST即表述性状态传递(英文:Representational State Transfer,
简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的
一种软件架构风格。
它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,
提高系统的可伸缩性。
RESTFul是一种软件架构风格、设计风格,而不是标准,
只是提供了一组设计原则和约束条件。它主要用于客户端和服务器
交互类的软件。基于这个风格设计的软件可以更简洁,
更有层次,更易于实现缓存等机制。
REST 指的是一组架构约束条件和原则。
满足这些约束条件和原则的应用程序或设计就是
RESTful。遵循restful风格开发出来的应用程序接口,就叫RESTFul API。
RESTFul的接口都是围绕资源以及对资源的各种操作展开。
a.一种格式:以JSON传递数据。
b.两种路由
访问个体资源
/resource/resid/
#访问集体资源
/resource/
c.四种方法
POST:Create增加请求
DELETE:Delete删除请求
PUT:Update修改请求
GET:Retrieve查询请求
思路概述
一切请求都是对资源的访问
路由表示资源
任何访问本质上都是对数据的CRUD
通过方法表示意图
资源
所谓的资源就是在网络上存在的任意实体,哪怕是一条消息。
操作
POST | 创建新的资源 | http://127.0.0.1:5000/source
DELETE | 删除指定资源 | http://127.0.0.1:5000/source/250
PUT | 更新指定资源 | http://127.0.0.1:5000/source/250
GET | 获取所有资源 | http://127.0.0.1:5000/source
GET | 获取指定资源 | http://127.0.0.1:5000/source/250
数据
通常传输的数据都采用JSON格式,有时也会使用GET传参
工具
说明:postman是一款非常好用的API开发测试工具,
可以非常方便的模拟各种请求
提示:下载安装包,一路NEXT完成安装
网址:https://www.getpostman.com
2、 原生实现
获取所有资源
# 获取资源列表
@app.route('/posts')
def get_posts_list():
return jsonify({'posts': posts})
获取指定资源
# 获取资源列表
@app.route('/posts')
def get_posts_list():
return jsonify({'posts': posts})
添加新的资源
# 添加新的资源
@app.route('/posts', methods=['POST'])
def create_posts():
if not request.json or 'title' not in request.json or 'content' not in request.json:
abort(400)
# 创建新资源
p = {
'id': posts[-1]['id'] + 1,
'title': request.json['title'],
'content': request.json['content']
}
# 保存资源
posts.append(p)
return jsonify({'posts': p}), 201
更新指定的资源
# 修改指定资源
@app.route('/posts/<int:pid>', methods=['PUT'])
def update_posts(pid):
p = list(filter(lambda p: p['id'] == pid, posts))
if len(p) == 0:
abort(404)
if 'title' in request.json:
p[0]['title'] = request.json['title']
if 'content' in request.json:
p[0]['content'] = request.json['content']
return jsonify({'posts': p[0]})
删除指定资源
# 删除指定资源
@app.route('/posts/<int:pid>', methods=['DELETE'])
def delete_posts(pid):
p = list(filter(lambda p: p['id'] == pid, posts))
if len(p) == 0:
abort(404)
posts.remove(p[0])
return jsonify({'result': '数据已删除'})
错误定制
@app.errorhandler(404)
def page_not_found(e):
return jsonify({'error': 'page not found'}), 404
@app.errorhandler(400)
def bad_request(e):
return jsonify({'error': 'bad request'}), 400
flask-httpauth身份认证
导入和初始化
# 导入类库
from flask_httpauth import HTTPBasicAuth
# 创建对象
auth = HTTPBasicAuth()
认证的回调函数
# 认证的回调函数
@auth.verify_password
def verify_password(username, password):
# 此处的认证实际上应该查询数据库
if username == 'Jerry' and password == '123456':
return True
return False
认证错误定制
# 认证错误定制
@auth.error_handler
def unauthorized():
return jsonify({'error': 'Unauthorized Access'}), 403
保护指定的路由
# 获取资源列表
# 保护路由(需要认证才能访问)
@app.route('/posts')
@auth.login_required
def get_posts_list():
return jsonify({'posts': posts})
3、flask-restful
说明:是一个实现RESTFul API开发的扩展库
安装
pip install flask-restful
使用
导入和初始化
from flask_restful import Api, Resource
api = Api(app)
创建资源类(通常一个完整的资源需要两个资源类)
带参资源
class UserAPI(Resource):
def get(self, uid):
return {'User': 'GET'}
def put(self, uid):
return {'User': 'PUT'}
def delete(self, uid):
return {'User': 'DELETE'}
不带参资源
class UserListAPI(Resource):
def get(self):
return {'UserList': 'GET'}
def post(self):
return {'UserList': 'POST'}
绑定资源和路由
# 添加资源,可以一个资源指定多个路由地址
api.add_resource(UserAPI, '/users/<int:uid>', '/u/<int:uid>')
api.add_resource(UserListAPI, '/users')
# 若创建Api对象时没有指定app,那么指定app的位置应放在添加资源之后
# api.init_app(app)
添加认证
class UserAPI(Resource):
# 添加认证
decorators = [auth.login_required]
基于token的认证
获取token
# 获取token
@app.route('/get_token')
@auth.login_required
def generate_token():
s = Serializer(app.config['SECRET_KEY'], expires_in=3600)
return s.dumps({'username': g.username})
认证的回调函数
# 认证的回调函数
@auth.verify_password
def verify_password(username_or_token, password):
# 此处的认证实际上应该查询数据库
if username_or_token == 'Jerry' and password == '123456':
g.username = username_or_token
return True
# 再次尝试是否是token
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(username_or_token)
g.username = data.get('username')
return True
except:
return False
【后记】:如果文章对您有帮助,打赏下呗。微信 1257309054,欢迎交流学习*_*
微信

支付宝

Flask中的RESTFul的更多相关文章
- python中的Restful
哇,昨天组里进行总结的时候,小哥哥和小姐姐真是把我给秀到了,跟他们一比,我总结的太垃圾了,嘤嘤嘤.因为我平常不怎么总结,总结的话,有word还有纸质的,现在偏向于纸质,因为可以练练字.个人观点是,掌握 ...
- 使用python的Flask实现一个RESTful API服务器端
使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...
- Flask笔记:RESTful
RESTful是用于前台和后端进行通信的一种规范或者说一种风格,采用的是HTTP和HTTPS协议,数据传输的格式使用的都是JSON,而不是XML.通常,RESTful的URL中只有名词,没有动词,而且 ...
- FlASK中的endpoint问题
先贴一点有关的flask代码,时间有限,我慢慢扩充 以下是flask源码中app.py中add_url_rule的代码. 主要是view_func -- endpoint -- url 之间的对应关 ...
- 在Silverlight中实施RESTful调用
在Silverlight中实施RESTful调用: http://book.51cto.com/art/201006/206314.htm http://bbs.csdn.net/topic ...
- Flask 中的 SQLAlchemy 使用教程
Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...
- Flask中路由模块的实现
在Flask中的路由功能主要通过修饰函数route实现,下面我们就来挖掘下route在源代码中是怎么分配视图函数的. def route(self, rule, **options): def dec ...
- Flask中全局变量的实现
我们都知道在Flask中g,request,session和request是作为全局对象来提供信息的,既然是全局的又如何保持线程安全呢,接下来我们就看看flask是如何做到这点的.在源码中的ctx.p ...
- 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持
HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...
随机推荐
- spring-boot-route(八)整合mybatis操作数据库
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- 【随笔---转载】xip.io
http://xip.io/ wildcard DNS for everyone 今天看到一个老外发布的DNS小工具,XIP.IO.功能十分简单,就是将foo.bar.10.0.0.1.xip.io ...
- Cadence OrCAD如何查看整页原理图中的元件的属性
转载: 1.选中DSN文件右键"Edit Object Properties ".在这里插入图片描述2.单击选择"Pivot"按钮. 3.找到Part refe ...
- matlab中ceil朝正无穷大四舍五入
来源:https://ww2.mathworks.cn/help/matlab/ref/ceil.html?searchHighlight=ceil&s_tid=doc_srchtitle 本 ...
- 安装mariadb/mysql 连接失败问题
在linux下安装mariadb会出现一系列问题 问题1->服务器端不需要用户名密码就可登陆数据库 问题2->php使用mysql不能连接数据库 访问受限 问题3->navicate ...
- 第三十五章 Linux常规练习题(二)参考答案
一.练习题一 1.删除用户基本组shanghai03.发现无法正常删除,怎样才能将其删除掉,不能删除用户. groupdel shanghai03 移除其所属组的用户 2.打开多个xshell窗口连接 ...
- 这份算法攻略,我拿到了5个大厂的offer
每个时代,都不会亏待会学习的人. 大家好,我是 yes. 我持续在 LeetCode 刷算法题将近有一年半的时间了,这一年半以来我对算法的看法改变了很多,但是实话实说支持我前进的还是面试. 在之前的文 ...
- vue知识点10
今天彻底掌握了如下: 1.解决回调地狱三种方案 callback async await Promise 2.中间件(middleware) express.static ...
- pytest-pyppeteer:在pytest中运行pyppeteer
pytest-pyppeteer pytest-pyppeteer是我写的一个 pytest 插件,支持在 pytest 中运行pyppeteer,起因是为了解决工作中的一个测试需求,现在将其开源并做 ...
- springboot错误统一处理
1,对于404,500这类错误,可以直接新建public/error目录 ,在error目录 中新建404.html, 500.html或5xx.html,springboot会自动跳转到这些静态页面 ...