蚊章汇 - Masnun
type: channel
link: https://linuxcn.bwsl.wang/author/1085/
description: Masnun
items: API Star：一个 Python 3 的 API 框架

API Star：一个 Python 3 的 API 框架
type: item
date: 2018-09-08T04:54:16+08:00
description: 为了在 Python 中快速构建 API，我主要依赖于 Flask。最近我遇到了一个名为 “API Star” 的基于 Python 3 的新 API 框架。由于几个原因，我对它很感兴趣。首先，该框架包含 Python 新特点，如类型提示和 asyncio。而且它再进一步为开发人员提供了很棒的开发体验。我们很快就会讲到这些功能，但在我们开始之前，我首先要感谢 Tom Christie，感谢他为 Django REST Framework 和 API Star 所做的所有工作。现在说回 API Star —— 我感觉这个框架很有成效。我可以选择基于 asyncio 编写异步代码，或者可以选择传统后端方式就像 WSGI 那样。它配备了一个命令行工具 —— apistar 来帮助我们更快地完成工作。它支持 Django ORM 和 SQLAlchemy，这是可选的。它有一个出色的类型系统，使我们能够定义输入和输出的约束，API Star 可以自动生成 API 的模式（包括文档），提供验证和序列化功能等等。虽然 API Star 专注于构建 API，但你也可以非常轻松地在其上构建 Web 应用程序。在我们自己构建一些东西之前，所有这些可能都没有意义的。开始我们将从安装 API Star 开始。为此实验创建一个虚拟环境是一个好主意。如果你不知道如何创建一个虚拟环境，不要担心，继续往下看。pip install apistar（译注：上面的命令是在 Python 3 虚拟环境下使用的）如果你没有使用虚拟环境或者你的 Python 3 的 pip 名为 pip3，那么使用 pip3 install apistar 代替。一旦我们安装了这个包，我们就应该可以使用 apistar 命令行工具了。我们可以用它创建一个新项目，让我们在当前目录中创建一个新项目。apistar new .现在我们应该创建两个文件：app.py，它包含主应用程序，然后是 test.py，它用于测试。让我们来看看 app.py 文件：from apistar import Include, Route from apistar.frameworks.wsgi import WSGIApp as App from apistar.handlers import docs_urls, static_urls def welcome(name=None): if name is None: return {'message': 'Welcome to API Star!'} return {'message': 'Welcome to API Star, %s!' % name} routes = [ Route('/', 'GET', welcome), Include('/docs', docs_urls), Include('/static', static_urls) ] app = App(routes=routes) if __name__ == '__main__': app.main()在我们深入研究代码之前，让我们运行应用程序并查看它是否正常工作。我们在浏览器中输入 http://127.0.0.1:8080/，我们将得到以下响应：{"message": "Welcome to API Star!"}如果我们输入：http://127.0.0.1:8080/?name=masnun{"message": "Welcome to API Star, masnun!"}同样的，输入 http://127.0.0.1:8080/docs/，我们将看到自动生成的 API 文档。现在让我们来看看代码。我们有一个 welcome 函数，它接收一个名为 name 的参数，其默认值为 None。API Star 是一个智能的 API 框架。它将尝试在 url 路径或者查询字符串中找到 name 键并将其传递给我们的函数，它还基于其生成 API 文档。这真是太好了，不是吗？然后，我们创建一个 Route 和 Include 实例的列表，并将列表传递给 App 实例。Route 对象用于定义用户自定义路由。顾名思义，Include 包含了在给定的路径下的其它 url 路径。路由路由很简单。当构造 App 实例时，我们需要传递一个列表作为 routes 参数，这个列表应该有我们刚才看到的 Route 或 Include 对象组成。对于 Route，我们传递一个 url 路径，http 方法和可调用的请求处理程序（函数或者其他）。对于 Include 实例，我们传递一个 url 路径和一个 Routes 实例列表。路径参数我们可以在花括号内添加一个名称来声明 url 路径参数。例如 …