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。 您不会失望的。
评论已关闭。