介绍适用于 Python 的 Smit

作者: 乔丹·菲利普斯 | 202

亚马逊云科技 很高兴地宣布推出 Smithy 一代 Pythy 客户端 的预览版。该工具将使开发人员能够使用带有类型提示的 Python 生成客户端,其模型驱动方式与 亚马逊云科技 十多年来用于开发其服务的方式相同。为网络服务编写和维护手写客户端既耗时又容易出错,这些问题都可以通过生成具有明确规范的客户端来解决。我们已将 Smithy for Python 开源,以允许任何开发人员自信快速地生成自己的客户端。

什么是史密斯?

Smithy 是一个开源工具链,我们已经对其进行了标准化,用于构建新的 亚马逊云科技 开发工具包、对新的 亚马逊云科技 服务和功能进行建模以及生成客户端。Smithy 包含一种与协议无关的接口定义语言 (IDL),用于生成客户端、服务器、文档和其他工件。要了解更多信息,请访问s mithy.io ,并观看史密斯 首席工程师迈克尔·道林 的 介绍性演讲

包括什么?

代码生成的 Python 客户端将具有以下功能:

  • 代码生成和类型提示-客户端、操作及其包含的所有数据的代码将生成到 python 类中。除了类型提示外,这将允许客户使用诸如mypy或其他类型分析工具之类的工具轻松地整理和调试他们的代码。
  • 拦截器 — 拦截器是新的可扩展性功能,它取代了 botocore 事件系统。 它们旨在更加可靠,并在 Smithy 支持的所有语言中保持一致。
  • 首先是异步——异步在 Python 生态系统 中 变得越来越重要 ,而且由于客户将大部分时间都花在 IO 上,因此它们是它的完美用例。因此,所有操作都将作为异步函数生成。
  • 可配置组件-客户端的所有核心组件都将完全可配置。例如,如果你想使用龙卷风作为底层的 http 库,你可以很容易地做到这一点。

目前,协议支持仅限于 restJson1 协议,该协议使用 带有 JSON 正文的 http 绑定 。它被广泛用于亚马逊的服务中,例如API网关和Lambda。为了进行身份验证,目前支持 HttpaPiKey 身份验证。

入门

生成客户有三个先决条件。第一个先决条件是 Python,它的最低要求版本为 3.11。第二个先决条件是 Java 17,它只是构建生成器所必需的。将来,当生成器发布到软件包存储库时,将不需要这样做。也不需要运行生成的 Python 客户端。你需要的最后一个先决条件是 Smithy CLI

要构建生成器,请克隆 s mithy-python GitHub 存储库 并运行 make install- java 组件。 这将生成生成器并使其在您的本地计算机上可用。

现在你已经建造了生成器,你需要一个 Smithy 模型。在此示例中,您将为服务使用一个小型模型,该模型接受 JSON 正文中的字符串消息并未修改地返回该消息。将以下模型内容保存到名为 main.smithy 的文件 中,该文件位于名为 m odel 的目录中。

$version: "2.0"

namespace com.example

use aws.protocols#restJson1

@restJson1
service EchoService {
    operations: [Echo]
}

@http(
    method: "POST"
    uri: "/echo"
)
operation EchoMessage {
    input := {
        message: String
    }
    output := {
        message: String
    }
}

现在你需要创建一个名为 s mithy- build.json 的配置文件。此配置文件允许您指定依赖关系、配置插件和创建投影,这些是满足特定目的的模型的不同视图。sm ithy-b uild 文档中提供了有关如何使用此配置文件和预测的更多信息。 以下 s mithy-build.json 文件添加了一些必要的依赖关系,并创建了用于构建 python 客户端的投影。在与模型文件夹相同的目录中创建您的 sm ithy-build.json 文件,其中包含以下内容:

{
    "version": "1.0",
    "sources": ["model"],
    "maven": {
        "dependencies": [
            "software.amazon.smithy:smithy-model:1.34.0",
            "software.amazon.smithy:smithy-aws-traits:1.34.0",
            "software.amazon.smithy.python:smithy-python-codegen:0.1.0"
        ]
    },
    "projections": {
        "python-client": {
            "plugins": {
                "python-client-codegen": {
                    "service": "com.example#EchoService",
                    "module": "echo",
                    "moduleVersion": "0.1.0"
                }
            }
        }
    }
}

你的文件结构现在应该是这样的:

.
├── model
│   └── main.smithy
└── smithy-build.json

生成客户端剩下的唯一步骤就是运行 s mithy build 。现在,您的新客户端将作为可安装包在 build/python-client/python-client-codegen 中提供。要使用它,你需要通过 从 smithy-python 存储库的根目录运行 m ake install-python 组件来安装一些 Python 依赖项。以下片段显示了如何使用新客户端:

import asyncio

from echo.client import EchoService
from echo.config import Config
from echo.models import EchoMessageInput


async def main() -> None:
    client = EchoService(Config(endpoint_uri="https://example.com/"))
    response = await client.echo(EchoMessageInput(message="spam"))
    print(response.message)


if __name__ == "__main__":
    asyncio.run(main())

Smithy for Python 的下一步是什么?

我们将为代码生成器提供新功能,以便更轻松地生成自定义客户端。我们还将提供对更多协议和功能的支持,以生成更多类型的服务。

反馈

我们鼓励你试用 Smithy for Python 来构建自己的客户端。如果你有任何问题、意见、疑虑或想法,请在 s mithy-python GitH ub 存储库上打开问题或错误报告。 如果您发现潜在的安全问题,我们要求您改为通过我们的 漏洞报告页面 通知 亚马逊云科技/Amazon Security。我们感谢收到的任何反馈,并将用它来改进下一版本的客户。

作者简介:

Jordon Phillips

乔登·菲利普斯·

乔登是亚马逊云科技史密斯团队的高级软件开发工程师。他喜欢开发旨在改善开发者体验的项目和工具。