现在的位置: 主页 > 公司荣誉 > 文章列表

Python实现的Flask一个RESTful API 服务器端测试

作者:程力专用汽车股份有限公司 来源:www.chLiw.com 发布时间:2017-09-10 10:07:14
Python实现的Flask一个RESTful API 服务器端测试

REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了。

首先介绍:

REST的六个特性:

Client-Server:服务器端与客户端分离。

Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。

Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。

Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。

Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。

Code on demand(按需执行代码?):服务器端可以在上下文中执行代码或者脚本?
RESTful web service的样子

REST架构就是为了HTTP协议设计的。RESTful web services的核心概念是管理资源。资源是由URIs来表示,客户端使用HTTP当中的'POST, OPTIONS, GET, PUT, DELETE'等方法发送请求到服务器,改变相应的资源状态。

HTTP请求方法通常也十分合适去描述操作资源的动作:

HTTP方法 动作 例子
GET 获取资源信息

(检索订单清单)


GET 获取资源信息

(检索订单 #123)


POST 创建一个次的资源

(使用带数据的请求,创建一个新的订单)


PUT 更新一个资源

(使用带数据的请求,更新#123订单)


DELETE 删除一个资源

删除订单#123


REST请求并不需要特定的数据格式,通常使用JSON作为请求体,或者URL的查询参数的一部份。


设计一个简单的web service

下面的任务将会练习设计以REST准则为指引,通过不同的请求方法操作资源,标识资源的例子。

我们将写一个To Do List 应用,并且设计一个web service。

第一步,规划一个根URL,例如:

[hostname]/todo/api/v1.0/

上面的URL包括了应用程序的名称、API版本,这是十分有用的,既提供了命名空间的划分,同时又与其它系统区分开来。版本号在升级新特性时十分有用,当一个新功能特性增加在新版本下面时,并不影响旧版本。

第二步,规划资源的URL,这个例子十分简单,只有任务清单。

规划如下:

HTTP方法 URI 动作
GET [hostname]/todo/api/v1.0/tasks 检索任务清单
GET [hostname]/todo/api/v1.0/tasks/[task_id] 检索一个任务
POST [hostname]/todo/api/v1.0/tasks 创建一个新任务
PUT [hostname]/todo/api/v1.0/tasks/[task_id] 更新一个已存在的任务
DELETE [hostname]/todo/api/v1.0/tasks/[task_id] 删除一个任务

我们定义任务清单有以下字段:

id:唯一标识。整型。

title:简短的任务描述。字符串型。

description:完整的任务描述。文本型。

done:任务完成状态。布尔值型。

以上基本完成了设计部份,接下来我们将会实现它!


使用Python 和 Flask实现RESTful services

使用Flask建立web services超级简单。

当然,也有很多Flask extensions可以帮助建立RESTful services,但是这个例实在太简单了,不需要使用任何扩展。

这个web service提供增加,删除、修改任务清单,所以我们需要将任务清单存储起来。最简单的做法就是使用小型的数据库,但是数据库并不是本文涉及太多的。可以参考原文作者的完整教程。Flask Mega-Tutorial series

在这里例子我们将任务清单存储在内存中,这样只能运行在单进程和单线程中,这样是不适合作为生产服务器的,若非就必需使用数据库了。

现在我们准备实现第一个web service的入口点:

#!flask/bin/python from flask import Flask, jsonify app = Flask(__name__) tasks = [ { 'id': 1, 'title': u'Buy groceries', 'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 'done': False }, { 'id': 2, 'title': u'Learn Python', 'description': u'Need to find a good Python tutorial on the web', 'done': False } ] @app.route('/todo/api/v1.0/tasks', methods=['GET']) def get_tasks(): return jsonify({'tasks': tasks}) if __name__ == '__main__': app.run(debug=True)

正如您所见,并没有改变太多代码。我们将任务清单存储在list内(内存),list存放两个非常简单的数组字典。每个实体就是我们上面定义的字段。

而 index 入口点有一个get_tasks函数与/todo/api/v1.0/tasksURI关联,只接受http的GET方法。

这个响应并非一般文本,是JSON格式的数据,是经过Flask框架的jsonify模块格式化过的数据。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网页制作 https://www.feimao666.com

上一篇:PHP中Notice- Undefined index- sku in 问题解决方案 下一篇:最后一页