跳转到主要内容

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+移植版。

PyPI version Documentation Status Test Status Lint Status Code Style

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实现一致的代码风格,同时节省时间和精力用于更重要的任务
  • 使用pytestpytest-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一样。

项目详情


发布历史 发布通知 | RSS源

下载文件

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

源代码分发

graphql-core-3.2.4.tar.gz (504.6 kB 查看哈希值)

上传时间 源代码

构建分发

graphql_core-3.2.4-py3-none-any.whl (203.2 kB 查看哈希值)

上传时间 Python 3

支持