python RESTful API框架:Eve 快速入门

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:

{
    "_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来连接数据库:

# Let‘s just use the local mongod instance. Edit as needed.

# Please note that MONGO_HOST and MONGO_PORT could very well be left
# out as they already default to a bare bones local ‘mongod‘ instance.
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))运作:

# Enable reads (GET), inserts (POST) and DELETE for resources/collections
# (if you omit this line, the API will default to [‘GET‘] and provide
# read-only access to the endpoint).
RESOURCE_METHODS = [‘GET‘, ‘POST‘, ‘DELETE‘]

# Enable reads (GET), edits (PATCH), replacements (PUT) and deletes of
# individual items  (defaults to read-only item access).
ITEM_METHODS = [‘GET‘, ‘PATCH‘, ‘PUT‘, ‘DELETE‘]

当ITEM_METHODS 列表中的方法授权给项目端点(/people/)时RESOURCE_METHODS表中的方法才授权资源端点(/people)。都设置则会有一个全局作用域并使所有的端点都有效。然而你也可以启用或者禁用单个端点的HTTP方法等级,我们很快就能看到。

由于我们允许了编辑了,我们也希望让数据可以进行合适验证。让我们为people资源定义一种模式。

schema = {
    # Schema definition, based on Cerberus grammar. Check the Cerberus project
    # (https://github.com/nicolaiarocci/cerberus) for details.
    ‘firstname‘: {
        ‘type‘: ‘string‘,
        ‘minlength‘: 1,
        ‘maxlength‘: 10,
    },
    ‘lastname‘: {
        ‘type‘: ‘string‘,
        ‘minlength‘: 1,
        ‘maxlength‘: 15,
        ‘required‘: True,
        # talk about hard constraints! For the purpose of the demo
        # ‘lastname‘ is an API entry-point, so we need it to be unique.
        ‘unique‘: True,
    },
    # ‘role‘ is a list, and can only contain values from ‘allowed‘.
    ‘role‘: {
        ‘type‘: ‘list‘,
        ‘allowed‘: ["author", "contributor", "copy"],
    },
    # An embedded ‘strongly-typed‘ dictionary.
    ‘location‘: {
        ‘type‘: ‘dict‘,
        ‘schema‘: {
            ‘address‘: {‘type‘: ‘string‘},
            ‘city‘: {‘type‘: ‘string‘}
        },
    },
    ‘born‘: {
        ‘type‘: ‘datetime‘,
    },
}

更多的信息验证请看 数据有效性

现在让我们讨论下我们想进一步定制端点的people,我们想:

设置一项的标题为person

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

覆盖默认缓存控制指令

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

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

people = {
    # ‘title‘ tag used in item links. Defaults to the resource title minus
    # the final, plural ‘s‘ (works fine in most cases but not for ‘people‘)
    ‘item_title‘: ‘person‘,

    # by default the standard item entry point is defined as
    # ‘/people/<ObjectId>‘. We leave it untouched, and we also enable an
    # additional read-only entry point. This way consumers can also perform
    # GET requests at ‘/people/<lastname>‘.
    ‘additional_lookup‘: {
        ‘url‘: ‘regex("[\w]+")‘,
        ‘field‘: ‘lastname‘
    },

    # We choose to override global cache-control directives for this resource.
    ‘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,你可以使用到自己的实验和生活实例或本地(你也可以使用实例应用来填充或重置数据库)。

时间: 2024-10-03 05:09:02

python RESTful API框架:Eve 快速入门的相关文章

Nodejs ORM框架Sequelize快速入门

Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model和SQL的映射关系. const User = sequelize.define('user', { id: { type: Sequelize.INTEGER, allowNull: false, autoIncrement: true, primaryKey: true }, email: {

Shiro安全框架【快速入门】就这一篇!

Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro? is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro's easy-to-understand API, you can quickly and easily secure any ap

OpenStack Restful API框架介绍

1  pecan框架介绍 1.1  什么是pecan pecan是一个轻量级的python web框架,最主要的特点是提供了简单的配置即可创建一个wsgi对象并提供了基于对象的路由方式. 主要提供的功能点: (1)基于对象的路由分发 (2)支持restful接口方式 (3)可拓展的安全框架 (4)可拓展的模板语言支持 (5)可拓展的json支持 (6)简单的python配置 1.2  安装部署 为了不影响原有环境我们使用virtualenv工具创建一个隔离的python环境来做实验 $ virt

Shiro安全框架「快速入门」就这一篇

Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any ap

python中文件读写的快速入门实例

说明: 相比其他语言python真的简洁很多,自己往前在学习C语言的过程中,起码要到很后面很后面才提起文件操作,但python的快速入门却以一种非常简洁的方法让你对文件操作有个体验,当然这是在linux环境下,不过不得不说,linux环境下进行编程的学习,确实是要比windows下面可以学到更多知识,下面的两个例子都是来自<Python核心编程>这本书中,真的非常经典! 一.创建并写入文件的实例 直接给代码: #!/usr/bin/env python 'makeTextFile.py -- 

《Python核心编程 》手记-快速入门

春节终于over了,回归充实的学习研究生活.打开久违的CSDN博客,看到官方推送的 『博客Markdown编辑器上线啦』,让我顿时有了写作的欲望,真是程序员的福利.之前阅读各种文章书籍,都是用MarkDownPad做的笔记,喜欢以及习惯于MarkDown简洁的语法. 总之各种方便.为了试试效果,将以前阅读<Python核心编程>的手记整理发上来,也当温习一遍. 第二章 快速入门 print语句中使用字符串格式操作符,实现字符替换功能. print "%s is %d" %(

Python网络爬虫实战(一)快速入门

本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要的目的是爬取想要的数据还有通过爬虫去自动完成我们想在网站中做的一些事情. 从今天开始我会从基础开始讲解如何通过网络爬虫去完成你想要做的事. 先来看一段简单的代码. import requests #导入requests包 url = 'https://www.cnblogs.com/LexMoon/

【python开发教程】如何快速入门python开发?

想要学习python这门语言,却始终找不到一个全面的Python开发实战教程,倘若你是真心想学好一门语言,小编建议你亲自动手实践的.下面来看看入门python的学习教程. Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的).动态性.隐式类型(不需要做变量声明).大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言. 获取帮助 你可以很容易的通过Python解释器获取帮助.如果你想知道一个对象(object)是如何工作的,那么你所需要

分布式应用框架Akka快速入门

本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料在最后列出. 1.什么是Akka Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. 官方网站 (http://akka.io/)的介绍是: Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant ev