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的设计提供了接口规范,同时也降低了客户端与服务 ...
随机推荐
- 使用gettid() 注意事项
gettid()这个函数不可以在程序中直接使用,它是Linux本身的一个函数, 但是:仅包含#include <sys/types.h>,然后使用,编译时会报该函数未定义之类的错误! 解决 ...
- MATLAB中conv2的详细用法 (以及【matlab知识补充】conv2、filter2、imfilter函数原理)
转载: 1.https://blog.csdn.net/jinv5/article/details/52874880 2.https://blog.csdn.net/majinlei121/artic ...
- 安装、验证安装 Oracle Database XE 11gR2
操作系统:Windows 10 x64 第一节:下载 Oracle Database XE 11gR2 第二节:安装.验证安装 Oracle Database XE 11gR2 第三节:Oracle ...
- antd pro table中的文件上传
概述 示例代码 列表页面 form 页面 model.js service.js 总结 概述 项目中经常会遇到在表格中展示图片的需求(比如展示用户信息时, 有一列是用户的头像). antd pro t ...
- docker 升级后或者重装后,启动容器提示:Error response from daemon: Unknown runtime specified docker-runc
之前安装的版本是docker 1.3,并运行了容器jenkins 现在把docker升级版本为docker-ce 19.03 再使用docker ps发现之前的jenkins容器已经退出了 启动容器: ...
- rs232转以太网转换器
rs232转以太网转换器 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升 ...
- Git软件操作过程
一.下载 Git 二.下载Git小乌龟-TortoiseGit 三.汉化-去官网下载,官网地址 https://tortoisegit.org/download/
- 使用 volatile 关键字保证变量可见性和禁止指令重排序
volatile 概述 volatile 是 Java 提供的一种轻量级的同步机制.相比于传统的 synchronize,虽然 volatile 能实现的同步性要差一些,但开销更低,因为它不会引起频繁 ...
- docker19.03使用数据卷
一,查看当前的docker版本 [root@localhost data]# docker --version Docker version 19.03.8, build afacb8b 说明:刘宏缔 ...
- Drone 安装教程
Drone 安装教程 一. CentOS设置 1. 更换阿里源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...