概述
我们已经准备好了一个客户端来从 Spotify API 获取数据。我们 可以 直接在我们的 解析器 中使用它,但这会导致相当多的代码重复。相反,我们将使用 context
Strawberry 的功能来创建一个客户端 一次 并将其共享到所有 解析器 中。
在本课中,我们将
- 了解 Strawberry 中的
context
。 - 学习如何使用
info
参数 来访问我们context
中的 解析器。
什么是 context
?
Strawberry 中的 context
是一个对象,允许我们将任何类型的数据传递给我们的 解析器。通常,它用于数据库连接或身份验证信息等。
我们将使用 context
来共享 Spotify 客户端到我们所有的 解析器 中。
实例化客户端
要创建 Spotify 客户端的实例,我们将使用FastAPI 的生命周期 功能。
FastAPI 的生命周期
FastAPI 的生命周期功能使我们能够在应用程序启动和停止时运行代码。这对于设置需要创建一次并在请求之间共享的资源(就像我们的 Spotify 客户端!)很有用。
打开 main.py
文件,该文件包含所有服务器代码。
我们将在顶部导入一些东西: asynccontextmanager
(我们将需要它来使用生命周期)、 mock_spotify_rest_api_client.client
和 Request
来自 FastAPI。
from contextlib import asynccontextmanagerfrom mock_spotify_rest_api_client.client import Clientfrom fastapi import Request
接下来,我们可以定义生命周期函数,并使用 @asynccontextmanager
装饰它。
@asynccontextmanagerasync def lifespan(app):...
在里面,我们将实例化 Client
类,并为它提供 base_url
参数,其中 Spotify API 端点作为值。我们还将这个实例命名为 spotify_client
。
@asynccontextmanagerasync def lifespan(app):async with Client(base_url="https://spotify-demo-api-fe224840a08c.herokuapp.com/v1") as spotify_client:...
要使 spotify_client
在 FastAPI 应用程序中可用,我们可以 yield
一个包含它的对象。稍后,这个对象将在 request
对象中的 request.state
下可用。
yield {"spotify_client": spotify_client}
注意: yield
函数之前的代码在应用程序启动之前运行。您可以阅读有关 FastAPI 生命周期文档 的更多信息。
最后,让我们将 lifespan
传递到下面的 FastAPI
构造函数中。
app = FastAPI(lifespan=lifespan)
太好了!FastAPI 应用程序可以访问 Spotify 客户端,但我们仍然需要使用 context
将其传递到 解析器 中。
创建 context
对象
让我们从定义一个名为 context_getter
的异步函数开始。它接受一个名为 request
的 参数,类型为 Request
。
async def context_getter(request: Request):...
request
对象表示 GraphQL 请求,其中包含 GraphQL 操作 和任何 HTTP 标头。此外,它还包含我们之前在 lifespan
函数中设置的 spotify_client
对象!
现在,我们可以从 request.state
对象中访问 spotify_client
对象。
spotify_client = request.state.spotify_client
然后,我们将返回一个对象,表示 context
对象。在里面,我们将包含 spotify_client
。
return {"spotify_client": spotify_client}
最后,在下面,我们将这个 context_getter
函数传递到 GraphQLRouter
类的 context_getter
参数中。
graphql_router = GraphQLRouter(schema, path="/", graphql_ide="apollo-sandbox", context_getter=context_getter)
Strawberry 会在每个请求上自动调用 context_getter
并将结果通过 info
参数 传递到 解析器 中,我们将在下一课中处理这个问题。
关键要点
- Strawberry 中的
context
允许我们将数据传递给我们的 解析器。我们使用context_getter
参数在GraphQLRouter
中返回一个自定义的context
对象。 - FastAPI 的生命周期允许我们创建需要在请求之间共享的资源。
下一步
是时候让 解析器 函数开始对 Spotify API 发出真实请求了。
分享您关于本课程的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下方发布。还没有帐户吗? 请在我们的 Odyssey 论坛上发布。