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的更多相关文章

  1. python中的Restful

    哇,昨天组里进行总结的时候,小哥哥和小姐姐真是把我给秀到了,跟他们一比,我总结的太垃圾了,嘤嘤嘤.因为我平常不怎么总结,总结的话,有word还有纸质的,现在偏向于纸质,因为可以练练字.个人观点是,掌握 ...

  2. 使用python的Flask实现一个RESTful API服务器端

    使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...

  3. Flask笔记:RESTful

    RESTful是用于前台和后端进行通信的一种规范或者说一种风格,采用的是HTTP和HTTPS协议,数据传输的格式使用的都是JSON,而不是XML.通常,RESTful的URL中只有名词,没有动词,而且 ...

  4. FlASK中的endpoint问题

    先贴一点有关的flask代码,时间有限,我慢慢扩充 以下是flask源码中app.py中add_url_rule的代码. 主要是view_func  -- endpoint -- url 之间的对应关 ...

  5. 在Silverlight中实施RESTful调用

    在Silverlight中实施RESTful调用:   http://book.51cto.com/art/201006/206314.htm    http://bbs.csdn.net/topic ...

  6. Flask 中的 SQLAlchemy 使用教程

    Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...

  7. Flask中路由模块的实现

    在Flask中的路由功能主要通过修饰函数route实现,下面我们就来挖掘下route在源代码中是怎么分配视图函数的. def route(self, rule, **options): def dec ...

  8. Flask中全局变量的实现

    我们都知道在Flask中g,request,session和request是作为全局对象来提供信息的,既然是全局的又如何保持线程安全呢,接下来我们就看看flask是如何做到这点的.在源码中的ctx.p ...

  9. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

随机推荐

  1. Redis 4.0.2分布式锁的Java实现

    简介 Redis分布式锁算法有两种,一种是单个Redis实例下的,一种是多个Redis实例的Redlock算法. 官方推荐Redlock算法,但是这个算法需要比较多的Redis实例而且是完全互相独立, ...

  2. Leetcode-哈希表

    136. 只出现一次的数字 https://leetcode-cn.com/problems/single-number/ 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找 ...

  3. Onethink 前台编辑器调用

    比较偷懒的调用方式 <textarea name="content"></textarea> {:hook('documentEditFormContent ...

  4. linux 内核参数设置 - sysctl

    sysctl 命令用于查看和修改内核参数 查看指定参数: sysctl kernel.threads-max 查看所有参数: sysctl -a 修改指定参数: sysctl -w kernel.th ...

  5. EntityFramwork基础用法

    一.EntityFramework(简称"EF")是什么? 在.NET3.5之前,我们经常编写ADO.NET代码或通过封装好的数据库访问层来与数据库进行交互,进行CRUD操作.这种 ...

  6. ansible-playbook文件结构

    ansible-playbook文件结构: 1 --- 2 - name: play1 #指定的playbook名字 3 hosts: webservers #指定主机组 4 remote_user: ...

  7. Go | Go 使用 consul 做服务发现

    Go 使用 consul 做服务发现 目录 Go 使用 consul 做服务发现 前言 一.目标 二.使用步骤 1. 安装 consul 2. 服务注册 定义接口 具体实现 测试用例 3. 服务发现 ...

  8. 实验四  CSS样式的应用

    实验四  CSS样式的应用 注意:以下实验项目皆以本文件为操作对象,实验结果用记事本保留后预览,最后将添加的CSS代码转载到实验报告中 另本网页中蓝色加下划线的字即为默认的超链接样式 实验目的: 掌握 ...

  9. C++ 构造函数、拷贝构造函数、赋值运算符

    <C++ Primer Plus> 12.1 动态内存和类 12.1.1 复习示例和静态类成员 不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存 如果在头文 ...

  10. Verilog基础入门——简单的语句块编写(一)

    [题干] [代码] module top_module ( input in, output out ); assign out = ~in; endmodule 简单的实现一个非门