9. 上下文
15m

概述

我们已经准备好了一个客户端来从 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.clientRequest 来自 FastAPI。

main.py
from contextlib import asynccontextmanager
from mock_spotify_rest_api_client.client import Client
from fastapi import Request

接下来,我们可以定义生命周期函数,并使用 @asynccontextmanager 装饰它。

main.py
@asynccontextmanager
async def lifespan(app):
...

在里面,我们将实例化 Client 类,并为它提供 base_url 参数,其中 Spotify API 端点作为值。我们还将这个实例命名为 spotify_client

main.py
@asynccontextmanager
async 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 下可用。

main.py
yield {"spotify_client": spotify_client}

注意yield 函数之前的代码在应用程序启动之前运行。您可以阅读有关 FastAPI 生命周期文档 的更多信息。

最后,让我们将 lifespan 传递到下面的 FastAPI 构造函数中。

main.py
app = FastAPI(lifespan=lifespan)

太好了!FastAPI 应用程序可以访问 Spotify 客户端,但我们仍然需要使用 context 将其传递到 中。

创建 context 对象

让我们从定义一个名为 context_getter 的异步函数开始。它接受一个名为 request,类型为 Request

main.py
async def context_getter(request: Request):
...

request 对象表示 请求,其中包含 GraphQL 和任何 HTTP 标头。此外,它还包含我们之前在 lifespan 函数中设置的 spotify_client 对象!

现在,我们可以从 request.state 对象中访问 spotify_client 对象。

main.py
spotify_client = request.state.spotify_client

然后,我们将返回一个对象,表示 context 对象。在里面,我们将包含 spotify_client

main.py
return {"spotify_client": spotify_client}

最后,在下面,我们将这个 context_getter 函数传递到 GraphQLRouter 类的 context_getter 参数中。

main.py
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 发出真实请求了。

上一页

分享您关于本课程的疑问和评论

本课程目前处于

beta
.您的反馈有助于我们改进!如果您遇到困难或困惑,请告诉我们,我们会帮助您解决。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或处理过的评论可能会被删除。

您需要一个 GitHub 帐户才能在下方发布。还没有帐户吗? 请在我们的 Odyssey 论坛上发布。