Python的GraphQL实现,是GraphQL.js的移植版,GraphQL.js是GraphQL的JavaScript参考实现。
项目描述
GraphQL-core 3
GraphQL-core 3是Facebook创建的API查询语言GraphQL的JavaScript参考实现GraphQL.js(GraphQL.js)的Python 3.6+移植版。
GraphQL-core当前版本3.2.4与GraphQL.js版本16.8.2保持同步。
包含2300多个单元测试和100%覆盖率的大规模测试套件是对GraphQL.js完整测试套件的复制,确保该移植版可靠且与GraphQL.js兼容。
请注意,由于各种原因,GraphQL-core 与 GraphQL.js 不使用相同的 SemVer。GraphQL.js 的大版本号增加会反映在 GraphQL-core 的次要版本号上。这意味着当次要版本号改变时,API 可能会有破坏性变化,只有补丁版本才能实现完全向后兼容。因此,当将 GraphQL-core 作为依赖项包含时,我们建议使用类似 =~ 3.2.0
的版本指定符。
文档
有关 GraphQL-core 3 的更详细文档,请访问 graphql-core-3.readthedocs.io。
GraphQL.js 的文档可在此处找到 graphql.org/graphql-js/。
GraphQL 本身的文档可在此处找到 graphql.org。
还将有博客文章提供更多使用示例。
入门
有关 GraphQL 的一般概述可在README 中找到,该文档针对GraphQL 规范。该概述描述了作为此存储库中的测试存在的简单 GraphQL 示例集。开始使用此存储库的一个好方法是并行阅读该 README 和相应的测试。
安装
您可以使用内置的 pip 命令从 PyPI 安装 GraphQL-core 3
python -m pip install graphql-core
您也可以使用 poetry 在虚拟环境中安装
poetry install
使用方法
GraphQL-core 提供两种重要的功能:构建类型模式和针对该类型模式提供服务查询。
首先,构建一个映射到您的代码库的 GraphQL 类型模式
from graphql import (
GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)
schema = GraphQLSchema(
query=GraphQLObjectType(
name='RootQueryType',
fields={
'hello': GraphQLField(
GraphQLString,
resolve=lambda obj, info: 'world')
}))
这定义了一个简单的模式,包含一个类型和一个字段,它解析为一个固定值。The resolve
函数可以返回一个值、一个协程对象或这些对象的列表。它接受两个位置参数;第一个参数提供根或解析的父字段,第二个参数提供一个包含有关查询执行状态的 GraphQLResolveInfo
对象,包括一个 context
属性,该属性包含每个请求的状态,例如身份验证信息或数据库会话。任何 GraphQL 参数都作为单独的关键字参数传递给 resolve
函数。
请注意,GraphQL.js 中解析器函数的签名略有不同,其中上下文单独传递,参数作为单个对象传递。同样,请注意,必须显式地将 GraphQL 字段作为 GraphQLField
对象传递。类似地,必须将 GraphQL 参数作为 GraphQLArgument
对象传递。
一个更复杂的示例包含在顶级 tests 目录中。
然后,针对该类型模式提供查询的结果。
from graphql import graphql_sync
source = '{ hello }'
print(graphql_sync(schema, source))
这运行一个查询获取一个定义的字段,然后打印结果
ExecutionResult(data={'hello': 'world'}, errors=None)
graphql_sync
函数将首先确保查询在语法和语义上有效,然后再执行它,否则报告错误。
from graphql import graphql_sync
source = '{ BoyHowdy }'
print(graphql_sync(schema, source))
由于我们查询了一个不存在的字段,我们将得到以下结果
ExecutionResult(data=None, errors=[GraphQLError(
"Cannot query field 'BoyHowdy' on type 'RootQueryType'.",
locations=[SourceLocation(line=1, column=3)])])
graphql_sync
函数假定所有解析器都同步返回值。通过使用协程作为解析器,您也可以使用 graphql
函数以异步方式创建结果。
import asyncio
from graphql import (
graphql, GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)
async def resolve_hello(obj, info):
await asyncio.sleep(3)
return 'world'
schema = GraphQLSchema(
query=GraphQLObjectType(
name='RootQueryType',
fields={
'hello': GraphQLField(
GraphQLString,
resolve=resolve_hello)
}))
async def main():
query = '{ hello }'
print('Fetching the result...')
result = await graphql(schema, query)
print(result)
asyncio.run(main())
目标和限制
GraphQL-core 尽可能地尽可能忠实地重现 Python 中参考实现 GraphQL.js 的代码,并保持与 GraphQL.js 最新发展的同步。
GraphQL-core 3(之前称为GraphQL-core-next)被创建为一个现代的替代品,用于Syrus Akbary的先前作品GraphQL-core 2,该作品基于较旧的GraphQL.js版本,并针对较旧的Python版本。GraphQL-core 3的一些部分受到了GraphQL-core 2的启发,或者经过细微修改后直接采用,但大多数代码是从零开始重新实现的,非常接近于GraphQL.js的最新代码,并添加了Python的类型提示。
GraphQL-core 3库的设计目标是
- 为当前Python版本提供一个简单、无冗余、最先进的GraphQL实现
- 尽可能接近GraphQL.js参考实现,同时仍然提供Pythonic API和代码风格
- 充分利用Python类型提示,类似于GraphQL.js使用的Flow(现在使用TypeScript)
- 使用black实现一致的代码风格,同时节省时间和精力用于更重要的任务
- 使用pytest和pytest-describe来复制GraphQL.js的完整基于Mocha的测试套件
一些限制(主要符合设计目标)
- 需要Python 3.6或更高版本
- 不支持GraphQL.js中已弃用的一些方法和选项
- 仅支持通过async.io进行异步操作(不支持GraphQL-core中的其他执行器)
注意,我们同时使用令人惊叹的ruff工具来格式化和检查GraphQL-core 3的代码,此外还使用mypy作为类型检查器。
与其他库的集成和路线图
-
Graphene是一个用于在Python中构建GraphQL API的高级框架,已经建立了一个完整的生态系统,包括库、服务器集成和工具。这个Graphene生态系统的大部分也是由Syrus Akbary创建的,他同时将维护和未来开发转交给GraphQL-Python社区的成员。
Graphene 3现在使用Graphql-core 3作为核心库来完成大部分繁重的工作。
-
Ariadne是Mirumee Software创建的一个Python库,用于使用schema-first方法实现GraphQL服务器。
Ariadne也使用GraphQL-core 3作为其GraphQL实现。
-
Strawberry是由Patrick Arminio创建的一个新的Python 3 GraphQL库,灵感来源于dataclasses,它也使用GraphQL-core 3作为基础。
更改日志
更改以GitHub发行版跟踪。
致谢和历史
GraphQL-core 3库
- 由Christoph Zwerschke创建和维护
- 借鉴了Syrus Akbary的先前作品GraphQL-core 2的想法和代码
- 是GraphQL.js的Python端口,由Facebook Inc.的Lee Byron和其他人开发,现在是GraphQL基金会维护的
请观看Lee Byron在2019年开源领导力峰会上的简短主题演讲GraphQL的历史,以更好地了解GraphQL如何在Facebook被创建,然后开源,并移植到许多不同的编程语言。
许可
GraphQL-core 3是以MIT许可发布的,就像GraphQL.js一样。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解有关 安装包 的更多信息。