社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
(点击上方公众号,可快速关注)
编译:linux中国-MjSeven,英文:MASNUN
https://linux.cn/article-9987-1.html
为了在 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 路径参数。例如 /user/{user_id}
定义了一个 url,其中 user_id
是路径参数,或者说是一个将被注入到处理函数(实际上是可调用的)中的变量。这有一个简单的例子:
from apistar import Route
from apistar.frameworks.wsgi import WSGIApp as App
def user_profile(user_id: int):
return {'message': 'Your profile id is: {}'.format(user_id)}
routes = [
Route('/user/{user_id}', 'GET', user_profile),
]
app = App(routes=routes)
if __name__ == '__main__':
app.main()
如果我们访问 http://127.0.0.1:8080/user/23
,我们将得到以下响应:
{"message": "Your profile id is: 23"}
但如果我们尝试访问 http://127.0.0.1:8080/user/some_string
,它将无法匹配。因为我们定义了 user_profile
函数,且为 user_id
参数添加了一个类型提示。如果它不是整数,则路径不匹配。但是如果我们继续删除类型提示,只使用 user_profile(user_id)
,它将匹配此 url。这也展示了 API Star 的智能之处和利用类型和好处。
有时候将某些 url 组合在一起是有意义的。假设我们有一个处理用户相关功能的 user
模块,将所有与用户相关的 url 分组在 /user
路径下可能会更好。例如 /user/new
、/user/1
、/user/1/update
等等。我们可以轻松地在单独的模块或包中创建我们的处理程序和路由,然后将它们包含在我们自己的路由中。
让我们创建一个名为 user
的新模块,文件名为 user.py
。我们将以下代码放入这个文件:
from apistar import Route
def user_new():
return {"message": "Create a new user"}
def user_update(user_id: int):
return {"message": "Update user #{}".format(user_id)}
def user_profile(user_id: int):
return {"message": "User Profile for: {}".format(user_id)}
user_routes = [
Route("/new", "GET", user_new),
Route("/{user_id}/update", "GET", user_update),
Route("/{user_id}/profile", "GET", user_profile),
]
现在我们可以从 app 主文件中导入 user_routes
,并像这样使用它:
from apistar import Include
from apistar.frameworks.wsgi import WSGIApp as App
from user import user_routes
routes = [
Include("/user", user_routes)
]
app = App(routes=routes
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/iodjSVf8U1J7KYc/article/details/82634995
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
- 发表于 2021-12-11 17:53:33
- 阅读 ( 1196 )
- 分类:Go Web框架
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!