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. osgEarth使用笔记1——显示一个数字地球

    目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以直接 ...

  2. Python面向对象基础变量

    In [1]: class A: ...: NAME = 'A' # 类的直接下级作用域 叫做类变量 ...: def init(self, name): ...: self.name = name ...

  3. 大话Python函数底层逻辑

    函数 叫 子过程或子程序 描叙的更为贴近实际应用场景 这和数学中的函数实现上不同但语义上相识,如 f(x) = expressiom, 给定一个确定的输入必然返回一个确定的输出 数学中函数的关系是通过 ...

  4. Java知识系统回顾整理01基础06数组04增强型for循环

    增强型for循环在遍历一个数组的时候会更加快捷 一.增强型for循环 注:增强型for循环只能用来取值,却不能用来修改数组里的值 public class HelloWorld { public st ...

  5. matlab中bitshift 将位移动指定位数

    来源:https://ww2.mathworks.cn/help/matlab/ref/bitshift.html?searchHighlight=bitshift&s_tid=doc_src ...

  6. 用C写一个简单的推箱子游戏(二)

    下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...

  7. 使用AirtestProject+pytest做支付宝小程序UI自动化测试

    一,前言 1,背景 因公司业务需要做支付宝小程序的UI自动化测试,于是在网上查找小程序的自动化资料,发现微信小程序是有自己的测试框架的,但几乎找不到支付宝小程序UI自动化测试相关的资料.白piao失败 ...

  8. python程序整理(2)

    # 写一个函数完成三次登陆功能: # 用户的用户名密码从一个文件register中取出. # register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行. # 完 ...

  9. 【转载】opencvVS2019配置方法

    环境: 系统:win10系统截至2020920版本 opencv版本:3.0.0版本 IDE:宇宙最强IDEA最新版本2019社区版 教程: 1.下载opencv安装包官网下载链接:https://o ...

  10. 【暑假集训】HZOI2019 Luogu P1006 传纸条 二三四维解法

    写三次丢失两次,我谔谔,以后再不在博客园先保存我就去死 题目内容 洛谷链接 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学被安排坐成一个\(m\)行.\(n\ ...