模式#

每个 GraphQL API 都有模式(Schema),用于定义 API 的所有功能。模式是通过传递三种对象类型来定义的:QueryMutationSubscription

MutationSubscription 是可选的,同时 Query 必须始终存在。

使用 Strawberry 定义的模式示例:

import strawberry


@strawberry.type
class Query:
    @strawberry.field
    def hello(self) -> str:
        return "Hello World"


schema = strawberry.Schema(Query)

模式 API 参考#

class Schema(Query, mutation=None, subscription=None, **kwargs):
    ...

query: Type#

Strawberry 类型的根查询。通常称为 Query

备注

创建 Schema 时总是需要查询类型。

mutation: Optional[Type] = None#

根变更类型。通常叫做 Mutation

subscription: Optional[Type] = None#

根订阅类型。通常称为 Subscription

config: Optional[StrawberryConfig] = None#

传递 StrawberryConfig 对象来配置如何生成模式。阅读更多

types: List[Type] = []#

要注册到 Schema 的额外类型的列表,这些类型不是直接从根查询链接到的。

使用接口时定义额外的 types
from datetime import date
import strawberry


@strawberry.interface
class Customer:
    name: str


@strawberry.type
class Individual(Customer):
    date_of_birth: date


@strawberry.type
class Company(Customer):
    founded: date


@strawberry.type
class Query:
    @strawberry.field
    def get_customer(
        self, id: strawberry.ID
    ):  # -> Customer   note we're returning the interface here
        if id == "mark":
            return Individual(name="Mark", date_of_birth=date(1984, 5, 14))

        if id == "facebook":
            return Company(name="Facebook", founded=date(2004, 2, 1))


schema = strawberry.Schema(Query, types=[Individual, Company])

extensions: List[Type[Extension]] = []#

添加到模式的 extensions

scalar_overrides: Optional[Dict[object, ScalarWrapper]] = None#

重写内置标量的实现。更多信息.


方法#

.execute() (async)#

针对模式执行 GraphQL 操作(async)。

async def execute(query, variable_values, context_value, root_value, operation_name):
    ...

query: str#

要执行的 GraphQL 文档。

variable_values: Optional[Dict[str, Any]] = None#

这个操作的变量。

context_value: Optional[Any] = None#

将传递给解析器的上下文的值。

root_value: Optional[Any] = None#

将传递给根解析器的根值的值。

operation_name: Optional[str] = None#

要执行的操作的名称,在发送包含多个操作的文档时非常有用。如果没有指定 operation_name,则第一个 文档中的操作将被执行。

.execute_sync()#

针对模式执行 GraphQL 操作

def execute_sync(query, variable_values, context_value, root_value, operation_name):
    ...

query: str#

要执行的 GraphQL 文档。

variable_values: Optional[Dict[str, Any]] = None#

这个操作的变量。

context_value: Optional[Any] = None#

将传递给解析器的上下文的值。

root_value: Optional[Any] = None#

将传递给根解析器的根值的值。

operation_name: Optional[str] = None#

要执行的操作的名称,在发送包含多个操作的文档时非常有用。如果没有指定 operation_name,则第一个 文档中的操作将被执行。


处理执行错误#

默认情况下,Strawberry 会将查询执行过程中遇到的任何错误记录到 strawberry.execution 日志。这种行为可以通过重写模式的 strawberry.Schema 类的 process_errors` 函数来改变。

默认的功能是这样的:

# strawberry/schema/base.py
from strawberry.types import ExecutionContext

logger = logging.getLogger("strawberry.execution")


class BaseSchema:
    ...

    def process_errors(
        self,
        errors: List[GraphQLError],
        execution_context: Optional[ExecutionContext] = None,
    ) -> None:
        StrawberryLogger.error(error, execution_context)
# strawberry/utils/logging.py
from strawberry.types import ExecutionContext


class StrawberryLogger:
    logger: Final[logging.Logger] = logging.getLogger("strawberry.execution")

    @classmethod
    def error(
        cls,
        error: GraphQLError,
        execution_context: Optional[ExecutionContext] = None,
        # https://www.python.org/dev/peps/pep-0484/#arbitrary-argument-lists-and-default-argument-values
        **logger_kwargs: Any,
    ) -> None:
        # "stack_info" is a boolean; check for None explicitly
        if logger_kwargs.get("stack_info") is None:
            logger_kwargs["stack_info"] = True

        # stacklevel was added in version 3.8
        # https://docs.python.org/3/library/logging.html#logging.Logger.debug
        if sys.version_info >= (3, 8):
            logger_kwargs["stacklevel"] = 3

        cls.logger.error(error, exc_info=error.original_error, **logger_kwargs)