4. 你好,世界
5m

概述

目前,我们将保持简单,并尝试一个经典的“你好,世界”示例来构建我们的架构。别担心,我们稍后会深入探讨播放列表和曲目!

在本课中,我们将

  • 了解Query 类型
  • 根据 Query 类型创建架构

Query 类型

Query 类型定义了我们允许从我们的 查询的项目列表。它是我们架构的入口点!

所有 API 相关的内容都将位于 api 文件夹中。我们将把根类型(如 Query 以及稍后的 Mutation)保存在 api 文件夹的根目录中。所有其他 将位于 api/types 文件夹中。

让我们在 api 的根目录中创建一个名为 query.py 的文件。

在顶部,让我们导入 strawberry 模块。

api/query.py
import strawberry

然后,我们将添加一个名为 Query 的类。

api/query.py
class Query:
...

现在,这只是一个普通的 Python 类。为了将其定义为 类型,我们应用 strawberry.type 函数。

strawberry.type

此函数告诉 Strawberry 该类是一个 类型,应该包含在架构中。它还会找到类的所有属性,并将它们添加为 ,这些字段属于 GraphQL 类型。

但它不仅仅是这些!Strawberry 在幕后使用了 dataclasses 来创建一个功能齐全的类,其中包含构造函数、相等性检查等等。

strawberry.type 接受多个 ,但两个常用的参数是:

  • description:设置 类型的描述,以帮助 API 消费者理解该类型是什么或应该如何使用它。
  • name:设置 中的类型名称。默认情况下,Strawberry 将通过将类的名称转换为 PascalCase(一种 的常用约定)来生成名称。

让我们继续将 Query 类型定义为 类型。在类定义之前,我们将应用 strawberry.type 函数并将其用作装饰器。(这意味着我们必须添加 @ 前缀!)

api/query.py
@strawberry.type
class Query:

Query 类中,让我们定义 hello 属性,它返回一个 str 类型。(你可以删除 ...!)

api/query.py
hello: str

这是有效的 所需的最低限度。在 中,等效的 GraphQL 架构看起来像这样:

等效的 GraphQL 架构
type Query {
hello: String!
}

定义解析器

我们仍然需要一种方法来为这个 返回 数据,使用一个 。为了定义解析器,我们使用 strawberry.field 函数。

strawberry.field

此函数告诉 Strawberry 类的特定属性是 ,并且可以使用特定函数进行解析。

strawberry.field 接受多个 ,但三个常用的参数是:

  • resolver:负责为 返回数据的 的函数名称。
  • description:设置 类型的描述,以帮助 API 消费者理解该类型是什么或应该如何使用它。
  • name:设置 中的类型名称。默认情况下,Strawberry 将通过将属性的名称转换为 camelCase 来生成名称。

定义 hello 解析器

让我们看看它是如何工作的。

首先,我们将定义一个新函数, Query之外,名为 get_hello。它返回一个硬编码的字符串 "Hello world"

api/query.py
def get_hello():
return "Hello world"

接下来,我们需要将此函数作为 hello 属性。在 Query 类中,找到 hello 属性并将其设置为 strawberry.field 函数的值,传入 resolver 并将其设置为 get_hello

api/query.py
hello: str = strawberry.field(resolver=get_hello)

完美,我们已经有了模式的内容和 就位。

创建模式

我们的 需要了解 Query 类型。在上一课中,我们使用 ... 作为我们模式的占位符。让我们将其更新为指向包含 Query 类型的真实模式。

首先,我们将在 api 文件夹中创建一个名为 schema.py 的新文件。

📦 odyssey-intro-strawberry
┣ 📂 api
┃ ┣ 📄 __init__.py
┃ ┣ 📄 query.py
┃ ┗ 📄 schema.py
┣ 📂 data
┃ ┗ 📄 openapi.json
┣ 📄 main.py
┣ 📄 pyproject.toml
┣ 📄 README.md
┣ 📄 requirements-dev.txt
┗ 📄 requirements.txt

在里面,我们将导入 strawberry 和我们刚刚创建的 Query 类。

api/schema.py
import strawberry
from .query import Query

要创建模式,我们使用 strawberry.Schema 类。此类接受一个 query (我们模式的入口点)。我们将它指向 Query 类型。我们将将其存储在一个名为 schema 中。

api/schema.py
schema = strawberry.Schema(query=Query)

在整个课程中,我们将向模式添加更多类型。

更新 GraphQL 端点

现在我们可以更新我们的 FastAPI 应用程序以使用此模式!跳回 main.py 文件。

让我们在文件顶部导入 schema 对象。

main.py
from api.schema import schema

然后,用 schema 替换 ... 占位符。

main.py
- graphql_router = GraphQLRouter(..., path="/", graphql_ide="apollo-sandbox")
+ graphql_router = GraphQLRouter(schema, path="/", graphql_ide="apollo-sandbox")

我们的 应该可以正常工作了!

练习

Query 类型在 GraphQL 中的目的是什么?
在基于注释的方法中,如何将 Query 类型注册到 GraphQL 服务器中?

关键要点

  • Query 类型是我们模式的入口点。这些是 消费者可以 的顶级
  • 我们使用 strawberry.type 将一个类定义为 类型,并应将其包含在模式中。它还会找到类的所有属性,并将它们添加为 的 GraphQL 类型。
  • 我们使用 strawberry.field 函数将一个类的特定属性定义为 ,并且可以使用特定函数进行解析。
  • 我们可以使用 strawberry.Schema 类创建模式,并将 Query 类型传递给它。

接下来

我们的 已准备好接收查询。在下一课中,我们将探索编写和发送查询的最佳方法:Apollo Explorer。

上一页

分享您对本课的疑问和评论

本课程目前处于

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

您需要一个 GitHub 帐户才能在下面发布。没有? 改在我们的 Odyssey 论坛中发布。