python的中继实现
graphql-rela的Python项目详细描述
graphql python的中继库
这是一个库,允许使用 GraphQL Python引用实现 一个graphql服务器。
注意:代码是原始graphql-relay js implementation的精确的端口 从Facebook
开始
需要基本了解graphql和graphql python实现 提供此库的上下文。
graphql的概述可以在 README对于 Specification for GraphQL。
这个库设计用于 GraphQL Python引用实现 一个graphql服务器。
与中继兼容的graphql服务器应该具备的功能概述 提供在GraphQL Relay Specification 在Relay website上。概述 描述一个简单的示例集合,该实例以tests的形式存在。 储存库。开始使用这个存储库的一个好方法是遍历 该文档与此库中的相应测试一起。
使用graphql python的中继库(graphql核心)
为graphql python安装中继库
pip install "graphql-core>=2,<3"# use version 2.x of graphql-core pip install graphql-relay
为GraphQL构建架构时, 提供的库函数可用于简化继电器的创建 模式。
连接
helper函数用于构建graphql类型
对于连接和实现字段的resolver
方法
返回这些类型。
connection_args
返回当 它们返回连接类型。connection_definitions
返回connection_type
及其关联edgeType
,给定名称和节点类型。connection_from_list
是一个helper方法,它接受一个列表和 来自connection_args
的参数,执行分页和筛选,并返回 由connection_type
的resolver
函数所期望的形状的对象。connection_from_promised_list
类似于connection_from_list
,但是 它需要一个promise,它解析为一个数组,并返回一个promise 通过connection_type
解析为预期形状。cursor_for_object_in_connection
是一个助手方法,它接受一个列表和一个 成员对象,并返回一个游标以用于变异负载。
这些方法的示例用法来自test schema:
ship_edge,ship_connection=connection_definitions('Ship',shipType)factionType=GraphQLObjectType(name='Faction',description='A faction in the Star Wars saga',fields=lambda:{'id':global_id_field('Faction'),'name':GraphQLField(GraphQLString,description='The name of the faction.',),'ships':GraphQLField(ship_connection,description='The ships used by the faction.',args=connection_args,resolver=lambdafaction,_info,**args:connection_from_list([getShip(ship)forshipinfaction.ships],args),)},interfaces=[node_interface])
这显示了向作为连接的Faction
对象添加ships
字段。
它使用connection_definitions({name: 'Ship', nodeType: shipType})
创建
连接类型,添加connection_args
作为此函数的参数,并且
然后通过传递船舶列表和
connection_from_list
的参数。
物体识别
helper函数用于构建graphql类型 对于节点和围绕本地id实现全局id。
node_definitions
返回对象可以实现的Node
接口, 并返回要包含在查询类型中的node
根字段。实施 这需要一个函数将id解析为一个对象,并确定 给定对象的类型。to_global_id
接受特定于该类型名的类型名和id, 并返回在所有类型中唯一的“全局id”。from_global_id
获取由to_global_id
创建的“全局id”,并返回 用于创建它的类型名和ID。global_id_field
为节点上的id
字段创建配置。plural_identifying_root_field
创建一个字段,该字段接受 非id标识符(比如用户名)然后映射到它们对应的 物体。
这些方法的示例用法来自test schema:
defget_node(global_id,_info):type_,id_=from_global_id(global_id)iftype_=='Faction':returngetFaction(id_)eliftype_=='Ship':returngetShip(id_)else:returnNonedefget_node_type(obj,_info):ifisinstance(obj,Faction):returnfactionTypeelse:returnshipTypenode_interface,node_field=node_definitions(get_node,get_node_type)factionType=GraphQLObjectType(name='Faction',description='A faction in the Star Wars saga',fields=lambda:{'id':global_id_field('Faction'),},interfaces=[node_interface])queryType=GraphQLObjectType(name='Query',fields=lambda:{'node':node_field})
它使用node_definitions
来构造Node
接口和node
字段;它使用from_global_id
来解析在实现中传入的id
将id映射到对象的函数。然后使用global_id_field
方法
在Faction
上创建id
字段,这也确保实现
node_interface
。最后,它使用
node_field
由node_definitions
返回。
突变
为buildi提供了一个helper函数ng突变 单输入和客户端变异ID。
mutation_with_client_mutation_id
接受名称、输入字段、输出字段, 以及一种从输入字段映射到输出字段的变异方法, 一路上进行变异。然后它创建并返回一个字段 可以用作变异类型的顶级字段的配置。
这些方法的示例用法来自test schema:
classIntroduceShipMutation(object):def__init__(self,shipId,factionId,clientMutationId=None):self.shipId=shipIdself.factionId=factionIdself.clientMutationId=clientMutationIddefmutate_and_get_payload(_info,shipName,factionId,**_input):newShip=createShip(shipName,factionId)returnIntroduceShipMutation(shipId=newShip.id,factionId=factionId,)shipMutation=mutation_with_client_mutation_id('IntroduceShip',input_fields={'shipName':GraphQLField(GraphQLNonNull(GraphQLString)),'factionId':GraphQLField(GraphQLNonNull(GraphQLID))},output_fields={'ship':GraphQLField(shipType,resolver=lambdapayload,_info:getShip(payload.shipId)),'faction':GraphQLField(factionType,resolver=lambdapayload,_info:getFaction(payload.factionId))},mutate_and_get_payload=mutate_and_get_payload)mutationType=GraphQLObjectType('Mutation',fields=lambda:{'introduceShip':shipMutation})
这段代码创建了一个名为IntroduceShip
的突变,它接受一个派别
输入id和船名。它输出Faction
和Ship
in
问题。mutate_and_get_payload
然后获取具有
每个输入字段,通过构造新船来执行变异,然后
返回将由输出字段解析的对象。
然后,我们的突变类型使用返回值创建introduceShip
字段
mutation_with_client_mutation_id
的值。
贡献
克隆此repo后,请确保通过运行以下命令安装依赖项:
python setup.py install
开发完成后,可以通过运行:
python setup.py test# Use --pytest-args="-v -s" for verbose mode