Eve是一款Python的REST API框架。用于公布高可定制的、全功能的RESTful的Web服务。帮你轻松创建和部署API,本文翻译自Eve官方站点:

http://python-eve.org/quickstart.html#database-interlude

Eve 高速入门:

渴望開始吗?这个页面将提供Eve一个非常好的介绍。在这之前假设:

你已经安装好了Eve。

假设你还没有,能够点击到安装页面。

已经安装了MongoDB。

而且MongoDB 已经运行了。

一个最小的应用

一个最小的Eve应用。看起来是这种:

from eve import Eve
app = Eve() if __name__ == '__main__':
app.run()

然后保存为run.py,接着创建一个新的文档包括已经内容:

DOMAIN = {'people': {}}

接着保存为settings.py。而且放在run.py同样的目录下。

这是Eve的配置文件,一个标准的python模块,这个文件告诉了Eve你的API包括了一个可訪问的资源。people。

如今你已经准备好启动你的API了。

$ python run.py
* Running on http://127.0.0.1:5000/

如今你已经能够使用这个API了:

$ curl -i http://127.0.0.1:5000
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 82
Server: Eve/0.0.5-dev Werkzeug/0.8.3 Python/2.7.3
Date: Wed, 27 Mar 2013 16:06:44 GMT

恭喜。你的GET请求已经得到了一个非常好的响应返回。让我们看看这个有效负载:

{
"_links": {
"child": [
{
"href": "people",
"title": "people"
}
]
}
}

API接入点遵循着HATEOAS(超媒体即状态应用引擎)原则和规定API资源訪问信息,在我们的样例中仅仅提供了一个可用child的资源,这里是people。

如今尝试请求people:

$ curl http://127.0.0.1:5000/people
{
"_items": [],
"_links": {
"self": {
"href": "people",
"title": "people"
},
"parent": {
"href": "/",
"title": "home"
}
}
}

这次我们也得到了一个_items 表,_links 相对于是被訪问的资源,所以你得到了父资源链接(主页)和资源本身。

默认情况下Eve 的APIs是仅仅读的:

$ curl -X DELETE http://127.0.0.1:5000/people
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method DELETE is not allowed for the requested URL.</p>

这是由于我们还没有在settings.py中规定不论什么的数据库细节,所以Eve会在无法索引到不论什么people表实际的内容(甚至可能不存在)时无缝得提供一个空的资源。由于我们不想让API的使用者down(不知道译成什么好…)。

插入数据库

让我们通过添加以下几行到setting.py来连接数据库:

# 依据编辑须要,让我们使用本地mongod实例

# 须要注意的是MONGO_HOST 和 MONGO_PORT非常有可能会无效。由于默认存在本地系统的值。

MONGO_HOST = 'localhost'
MONGO_PORT = 27017
MONGO_USERNAME = 'user'
MONGO_PASSWORD = 'user'
MONGO_DBNAME = 'apitest'

由于MongoDB便捷性,我们不须要真正得去创建数据表。实际上我们甚至不须要创建数据库:GET 请求空的或不存在的数据库是会返回正确(200 OK会得到一个空集合(表));DELETE/PATCH/PUT会得到适当的响应(404 Not Found),POST请求会创建所需的数据库或表。

然而这种自己主动管理的数据库会运行得非常差,由于缺少了索引和不论什么形式的优化。

一个更复杂的应用

到眼下为止我们的API都是仅仅读的。让我们能够全面得进行CRUD(添加(Create)、读取(Retrieve)(又一次得到数据)、更新(Update)和删除(Delete))运作:

# 授权资源、数据库  读 (GET), 插入 (POST) and 删除 DELETE
# (假设你省略这行, API将默认是 ['GET'] 和 提供仅仅读权限訪问端点).
# RESOURCE资源。METHODS方法 RESOURCE_METHODS = ['GET', 'POST', 'DELETE'] # 同意 读 (GET), 编辑 (PATCH), 替换 (PUT) 和删除 个人项目 items (默认訪问项目是仅仅读).
# ITEM 项目 ITEM_METHODS = ['GET', 'PATCH', 'PUT', 'DELETE']

当ITEM_METHODS 列表中的方法授权给项目端点(/people/)时RESOURCE_METHODS表中的方法才授权资源端点(/people)。

都设置则会有一个全局作用域并使全部的端点都有效。然而你也能够启用或者禁用单个端点的HTTP方法等级。我们非常快就能看到。

由于我们同意了编辑了,我们也希望让数据能够进行合适验证。

让我们为people资源定义一种模式。

schema = {
# 模式定义, 基于 Cerberus 语法. 核实 Cerberus 项目细节在
# (https://github.com/nicolaiarocci/cerberus)。 'firstname': {
'type': 'string',
'minlength': 1,
'maxlength': 10,
},
'lastname': {
'type': 'string',
'minlength': 1,
'maxlength': 15,
'required': True,
# 这个DEMO的目的是讨论硬约束
# 'lastname' 是一个 API 条目标记, 所以我们须要它独一无二。 'unique': True,
},
# 'role' 是一张表。和仅仅能是allowed中的值
'role': {
'type': 'list',
'allowed': ["author", "contributor", "copy"],
},
# 一种嵌入式固定类型的字典。
'location': {
'type': 'dict',
'schema': {
'address': {'type': 'string'},
'city': {'type': 'string'}
},
},
'born': {
'type': 'datetime',
},
}

很多其它的信息验证请看 数据有效性

如今让我们讨论下我们想进一步定制端点的people。我们想:

设置一项的标题为person

添加一个额外的自己定义项端点在/people/

覆盖默认缓存控制指令

禁用people 端点的DELETE(设置全局变量)

这里是完整得展示setting.py文件更新中people的定义:

people = {
# 'title'用于项目链接。 默认资源标题减去最后 复数 's' (在大部分情况下工作正常。而不是‘people’)
'item_title': 'person', # 依据标准项目接入点是定义成'/people/<ObjectId>'。
#. 我们让它不可更改 和我们也启动一个额外的仅仅读接入点 。这种方法也能让消费者运行GET请求'/people/<lastname>'。 'additional_lookup': {
'url': 'regex("[\w]+")',
'field': 'lastname'
}, # 我们决定对这个资源覆盖全局变量缓存控制准则。 'cache_control': 'max-age=10,must-revalidate',
'cache_expires': 10, # most global settings can be overridden at resource level
'resource_methods': ['GET', 'POST'], 'schema': schema
}

最后我们更新域定义:

DOMAIN = {
'people': people,
}

保存setting.py 和启动 run.py。

如今我们能够在people端点插入文档了:

$ curl -d '[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]' -H 'Content-Type: application/json'  http://127.0.0.1:5000/people
HTTP/1.0 201 OK

我们也能够更新和删除项目(但不能是整个资源,由于我们禁用了)。

我们也能够运行GET请求获取这个新的lastname端点:

$ curl -i http://127.0.0.1:5000/people/obama
HTTP/1.0 200 OK
Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc
Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
Cache-Control: 'max-age=10,must-revalidate'
Expires: 10
...
{
"firstname": "barack",
"lastname": "obama",
"_id": "50acfba938345b0978fccad7"
"updated": "Wed, 21 Nov 2012 16:04:56 GMT",
"created": "Wed, 21 Nov 2012 16:04:56 GMT",
"_links": {
"self": {"href": "people/50acfba938345b0978fccad7", "title": "person"},
"parent": {"href": "/", "title": "home"},
"collection": {"href": "people", "title": "people"}
}
}

缓存准则和项目标题符合我们新的设置。请看产品特性获取特性完整列表和很多其它的使用演示样例。

后记:

全部的样例和代码片段都来自Live demo。这是一个全功能的API,你能够使用到自己的实验和生活实例或本地(你也能够使用实例应用来填充或重置数据库)。

python RESTful API框架:Eve 高速入门的更多相关文章

  1. OpenStack Restful API框架介绍

    1  pecan框架介绍 1.1  什么是pecan pecan是一个轻量级的python web框架,最主要的特点是提供了简单的配置即可创建一个wsgi对象并提供了基于对象的路由方式. 主要提供的功 ...

  2. Python之Flask框架项目Demo入门

    Python+Flask框架项目Demo入门 本例子用到了 Flask+蓝图+Flask-Login+SQLAlchemy+WTForms+PyMySQL相关架构 Flask Web框架介绍 Flas ...

  3. Python编程Web框架 :Django 从入门到精通

    Django是一个高级别的Python Web框架,它鼓励快速开发和干净实用的设计. 现在我们开始学习它. Django学习之 第一章:Django介绍 Django学习之 第二章:Django快速上 ...

  4. flask + nginx + uwsgi + ubuntu18.04部署python restful接口

    目录 参考链接 效果展示 一.准备工作 1.1 可运行的python demo: 1.2 更新系统环境 二.创建python虚拟环境 三.设置flask应用程序 四.配置uWSGI 五.设置系统启动 ...

  5. RestFul API初识

    python Restful API 微博开放平台: open.weibo.com: 点击文档进入API查看界面 点击API文档进行查看: 比如点开粉丝数的API可以看到: pro.jsonlint. ...

  6. 虚拟研讨会:如何设计好的RESTful API?

    http://www.infoq.com/cn/articles/how-to-design-a-good-restful-api/ REST架构风格最初由Roy T. Fielding(HTTP/1 ...

  7. Python开源机器学习框架:Scikit-learn六大功能,安装和运行Scikit-learn

    Python开源机器学习框架:Scikit-learn入门指南. Scikit-learn的六大功能 Scikit-learn的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预 ...

  8. 虚拟研讨会:如何设计好的RESTful API(转)

    原文:虚拟研讨会:如何设计好的RESTful API? REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风 ...

  9. Yii2框架RESTful API教程(一) - 快速入门

    前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...

随机推荐

  1. 记intel杯比赛中各种bug与debug【其四】:基于长短时记忆神经网络的中文分词的实现

    (标题长一点就能让外行人感觉到高大上) 直接切入主题好了,这个比赛还必须一个神经网络才可以 所以我们结合主题,打算写一个神经网络的中文分词 这里主要写一下数据的收集和处理,网络的设计,代码的编写和模型 ...

  2. [USACO07MAR]每月的费用Monthly Expense

    题目:POJ3273.洛谷P2884. 题目大意:有n个数,要分成m份,每份的和要尽可能小,求这个情况下和最大的一份的和. 解题思路:二分答案,对每个答案进行贪心判断,如果最后得出份数>m,则说 ...

  3. 去除windows编辑文本中的回车符

    情景描述: 最近,huskiesir的朋友遇到了一个很奇葩的问题.那就是他在windows上搭建了一个http服务,把A脚本放在了上面并用linux去下载和执行,但是在执行的时候出现了问题,在linu ...

  4. 【J-meter】调试JDBC请求

    参考资料: http://www.codesec.net/view/165234.html

  5. Pythonx_day1

    # python3中的 str 和 byte(即二进制)转换 msg = "β" # 转换为二进制,打印,‘encoding = 'utf-8'为值定转换原str的编码格式’ pr ...

  6. 安装虚拟机(VM)(一)

    原创作品,允许转载,转载时请务必声明作者信息和本声明.  https://www.cnblogs.com/zhu520/p/10728248.html 本人小白,有错指出.谢谢! 一:安装虚拟机前奏 ...

  7. 解读I/O多路复用技术

    前言 当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应.在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起网络连接请求,2)用户在键盘上键入命 ...

  8. openGl超级宝典学习笔记 (2) 7个主要的几何图元

    点(GL_POINTS): 点总是正方形的像素,默认情况下,点的大小不受透视除法影响. 即无论与视点的距离怎样,它的大小都不改变.为了获得圆点.必须在抗锯齿模式下绘制点. 能够用glPointSize ...

  9. 如何保证对象线程内唯一:数据槽(CallContext)

    CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽.数据槽不在其他逻辑线程上的调用上下文之间共享.当 CallContext 沿执行代码路径 ...

  10. kafka offset的存储问题

    注意:从kafka-0.9版本及以后,kafka的消费者组和offset信息就不存zookeeper了,而是存到broker服务器上,所以,如果你为某个消费者指定了一个消费者组名称(group.id) ...