跳转到主要内容

用于扩展Ariadne GraphQL库的一组脚本和辅助工具

项目描述

Ariadne Extensions

Build Status Coverage Status

用于扩展Ariadne GraphQL库的一组脚本和辅助工具

安装

pip install ariadne-extensions

功能

联邦支持

支持联邦规范

功能

  1. 生成联邦模式类型和指令(_Any_FieldSet,...)
  2. 实现{_service{sdl}}查询
  3. 检测边界类型并生成_Entities联合
  4. 实现针对通过{_entities}查询的边界类型的解析引用辅助函数(resolve_referenceresolve_references装饰器)

文档

ariadne_extensions.federation.FederatedManager

FederatedManager是一个负责创建和执行符合联邦规范的模式的类。类似于make_executable_schema对普通模式文件所做的。

通过传递您的模式文件路径和QueryType实例来创建FederatedManager实例。管理器需要查询类型以注册_entities_service解析器。

query_type = QueryType()
manager = federation.FederatedManager(
    schema_sdl_file='/some/path/schema.graphql',
    query=query_type,
)

通过调用 add_types 方法或扩展 manager.types 列表来注册任何其他 ObjectType 和解析器。

photo_type = ObjectType('Photo')
thumbnail_type = ObjectType('Thumbnail')

manager.add_types(photo_type, thumbnail_type)
manager.types.append(snake_case_fallback_resolvers)

最后,获取一个编译后的模式。此编译后的模式将使用 Federation 规范协议所需的方向、类型和查询扩展 '/some/path/schema.graphql' 中定义的类型。

schema = manager.get_schema()
ariadne_extensions.federation.FederatedObjectType

如果您使用 GraphQL Federation,则您的服务模式可能实现了所谓的“边界对象”。这就是 FederatedObjectType 有用的地方。

FederatedObjectType 实现了 resolve_referenceresolve_references 装饰器。这些装饰器用于注册当联邦网关调用 {_entities{}} 查询时将被调用的函数。

假设 User 是一个边界类型,只有一个 id 键。您需要实现一个函数,该函数将接受键的字典(例如,在我们的例子中为 {'id': ...})并返回一个 User 实例。FederatedManager 将为每个 _entities([{__typename: 'User', id: ...}]) 查询调用此函数。

user_type = federation.FederatedObjectType('User')

@user_type.resolve_reference
def resolve_user_reference(representation, obj, info):
    user_id = representation.get('id')
    return get_user_by_id(user_id)

FederatedObjectType 扩展了 Ariadne 的 ObjectType。您仍然可以使用 field 装饰器、set_alias 方法和其他在常规 ObjectType 中使用的功能。

@user_type.field('name')
def resolve_billing_account(obj, *_, id):
    return f'{obj.first_name} {obj_last_name}'

别忘了将 user_type 添加到我们的管理器中。

manager.add_types(user_type)

示例

type User @key(fields: "id") @extends {
    id: ID! @external
    photos: [Photo]!
}

type Photo {
    id: ID!
    url: String!
    description: String
}
from os.path import dirname, join
from ariadne import QueryType, ObjectType, snake_case_fallback_resolvers

from ariadne_extensions import federation

query_type = QueryType()
manager = federation.FederatedManager(
    schema_sdl_file=join(dirname(__file__), 'schema.graphql'),
    query=query_type,
)

user_type = federation.FederatedObjectType('User')
photo_type = ObjectType('Photo')

@user_type.resolve_reference
def resolve_user_reference(representation, obj, info):
    user_id = representation.get('id')
    return get_user_by_id(user_id)

@user_type.field('name')
def resolve_billing_account(obj, *_, id):
    return f'{obj.first_name} {obj_last_name}'

manager.add_types(user_type, photo_type)
manager.add_types(snake_case_fallback_resolvers)

schema = manager.get_schema()

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解有关 安装包 的更多信息。

源分布

ariadne-extensions-0.1.7.tar.gz (4.9 kB 查看哈希值)

上传时间

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面