如何使用 Pyramid 和 Cornice 编写 Python Web API

使用 Pyramid 和 Cornice 构建和文档化可扩展的 RESTful Web 服务。
134 位读者喜欢这篇文章。
Searching for code

Opensource.com

Python 是一种高级的、面向对象的编程语言,以其简洁的语法而闻名。它一直是构建 RESTful API 的顶级编程语言之一。

Pyramid 是一个 Python Web 框架,旨在随着应用程序扩展:对于简单的应用程序来说它很简单,但可以为大型、复杂的应用程序增长。 除此之外,Pyramid 还为 PyPI(Python 包索引)提供支持。 Cornice 提供了使用 Pyramid 构建和文档化 REST-ish Web 服务的助手。

本文将使用获取名人名言的 Web 服务示例来展示如何使用这些工具。

设置 Pyramid 应用程序

首先为您的应用程序创建一个虚拟环境和一个用于保存代码的文件

$ mkdir tutorial
$ cd tutorial
$ touch main.py
$ python3 -m venv env
$ source env/bin/activate
(env) $ pip3 install cornice twisted

导入 Cornice 和 Pyramid 模块

使用以下命令导入这些模块

from pyramid.config import Configurator
from cornice import Service

定义服务

将 quotes 服务定义为 Service 对象

QUOTES = Service(name='quotes',
                 path='/',
                 description='Get quotes')

编写 quotes 逻辑

到目前为止,这仅支持 GET 获取 quotes。使用 QUOTES.get 修饰函数;这就是将逻辑绑定到 REST 服务的方式

@QUOTES.get()
def get_quote(request):
    return {
        'William Shakespeare': {
            'quote': ['Love all, trust a few, do wrong to none',
            'Some are born great, some achieve greatness, and some have greatness thrust upon them.']
    },
    'Linus': {
        'quote': ['Talk is cheap. Show me the code.']
        }
    }

请注意,与其他框架不同,get_quote 函数会被装饰器更改。 如果您导入此模块,您仍然可以正常调用该函数并检查结果。

这在为 Pyramid RESTful 服务编写单元测试时非常有用。

定义应用程序对象

最后,使用 scan 查找所有修饰的函数并将它们添加到配置中:

with Configurator() as config:
    config.include("cornice")
    config.scan()
    application = config.make_wsgi_app()

scan 的默认值是扫描当前模块。 如果您想扫描包中的所有模块,也可以提供包的名称。

运行服务

我使用 Twisted 的 WSGI 服务器来运行应用程序,但如果您愿意,可以使用任何其他 WSGI 服务器,例如 Gunicorn 或 uWSGI

(env)$ python -m twisted web --wsgi=main.application

默认情况下,Twisted 的 WSGI 服务器在端口 8080 上运行。 您可以使用 HTTPie 测试该服务

(env) $ pip install httpie
...
(env) $ http GET https://#:8080/
HTTP/1.1 200 OK
Content-Length: 220
Content-Type: application/json
Date: Mon, 02 Dec 2019 16:49:27 GMT
Server: TwistedWeb/19.10.0
X-Content-Type-Options: nosniff

{
    "Linus": {
        "quote": [
            "Talk is cheap. Show me the code."
        ]
    },
    "William Shakespeare": {
        "quote": [
            "Love all,trust a few,do wrong to none",
            "Some are born great, some achieve greatness, and some greatness thrust upon them."
        ]
    }
}

为什么使用 Pyramid?

Pyramid 不是最流行的框架,但它被用于一些备受瞩目的项目,例如 PyPI。 我喜欢 Pyramid,因为它是一个认真对待单元测试的框架:因为装饰器不会修改函数,并且没有线程局部变量,所以函数可以直接从单元测试中调用。 例如,需要访问数据库的函数将通过 request.config 从传入的 request 对象中获取它。 这允许单元测试人员在请求中放置一个模拟(或真实的)数据库对象,而不是仔细设置全局变量、线程局部变量或其他框架特定的东西。

如果您正在寻找一个经过良好测试的库来构建您的下一个 API,请尝试 Pyramid。 您不会失望的。

接下来阅读什么
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,帮助举办 Linux “安装派对”。 他从 1999 年开始编写 Python 代码,并为核心 Python 解释器做出了贡献。 Moshe 在 DevOps/SRE 这些术语出现之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重复性等。

评论已关闭。

© . All rights reserved.