用于扩展Ariadne GraphQL库的一组脚本和辅助工具
项目描述
Ariadne Extensions
用于扩展Ariadne GraphQL库的一组脚本和辅助工具
安装
pip install ariadne-extensions
功能
联邦支持
支持联邦规范
功能
- 生成联邦模式类型和指令(
_Any
,_FieldSet
,...) - 实现
{_service{sdl}}
查询 - 检测边界类型并生成
_Entities
联合 - 实现针对通过
{_entities}
查询的边界类型的解析引用辅助函数(resolve_reference
和resolve_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_reference
和 resolve_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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7d041d8674a985f33464852544bbe28407e4265642f50572d3f22b835ccd5dc5 |
|
MD5 | f75c02ed2a1bd40f2461463d43588891 |
|
BLAKE2b-256 | e777686eac1aebdd7fc8c238566bc4ccb0b4680b9d4ad9e5864b5f6be0590df2 |