Graphene Python

2025年3月17日 | 阅读 7 分钟

Python 因其易用性和简洁性,被认为是深受喜爱的通用编程语言之一。此外,GraphQL 是一种用于应用程序编程接口和服务器运行时的声明式查询语言,与 Python 配合得非常好。然而,目前可用的全面学习材料非常少,无法为程序员提供有关将 GraphQL 与 Python 一起使用的分步指南。

Graphene 是用 Python 这样的编程语言创建 GraphQL 端点的最佳库之一。它经过了动态的改进。它包含了 Django ORM、SQLAlchemy 和 MongoDB 的相当完整的辅助库。实现简单的功能相当容易。Graphene 的文档还有很多不足之处。借助其文档,可以轻松地用 GraphQL 实现简单的功能;但是,要实现一些健壮、生产就绪且功能强大的功能是另一回事。

在接下来的教程中,我们将重点介绍使用 Graphene 库将 GraphQL 与 Python 一起使用。

但在我们开始之前,让我们简要讨论一下本教程的目标和要求。

目的

我们将构建一个基于爬取服务的项目。本项目将使用提取库。

此爬取服务将以以下方式提交客户端请求:

服务器的响应将是:

每个网站还将包含一个描述字段。

环境设置

假设我们本地已经安装了 Python 3 版本,那么让我们先为依赖项创建一个虚拟环境。为了创建一个,让我们从安装 virtualenv 开始,如下所示:

语法

输出

created virtual environment CPython3.9.0.final.0-64 in 45108ms
  creator CPython3Windows(dest=D:\Python\env, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\Mango\AppData\Local\pypa\virtualenv)
    added seed packages: pip==21.2.2, setuptools==57.4.0, wheel==0.36.2
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator

让我们激活虚拟环境。

Windows、MacOS 和 Linux 的语法非常不同。

1. 对于 Windows

语法

2. 对于 MacOS / Linux

语法

现在,让我们了解一下项目所需的库。

  1. 提取
  2. Graphene
  3. Flask-graphql
  4. Requests

我们可以使用 pip 安装程序单独安装它们,如下所示:

语法

我们可以将它们作为一个组安装,如下所示:

语法

爬取和提取

在开始使用 GraphQL 之前,让我们简要了解一下下面用于爬取和提取网站数据的代码片段。

示例

输出


说明

在上面的代码片段中,我们导入了所需的库并定义了一个名为 extract() 的提取函数。

在函数内部,我们使用 requests 模块请求 URL 的详细信息,并将这些详细信息存储在名为 myhtml 的变量中。然后,我们使用提取模块的 Extractor()

函数提取用户所需的数据并打印给用户。

最后,我们调用 extract() 函数,并指定要从中提取数据的 URL。

我们可以观察到,每个提取的对象都会生成不同的数据部分,例如 title、url、image、descriptionfeed

模式

GraphQL schema 是 GraphQL API 的基础。它有助于描述所暴露 API 的类型、字段和对象。我们利用 Graphene 库来将 schema 描述为 Python 中的一个对象。

我们可以以一种非常简单的方式编写一个 schema 来描述提取的网站,如下所示:

示例

说明

在上面的代码片段中,我们导入了 graphene 库并定义了一个名为 myWebsite 的类,该类继承了 graphene 库的 ObjectType 类。这个 ObjectType 作为构建块,用于定义 Schema 中的字段与检索它们数据的方式之间的关系。在类内部,我们定义了不同的字段,并使用 graphene 库的 String() 来描述字段的类型;但是,每个字段都可以是我们描述的另一个对象,或者其他几个 lists、scalars、enums 等等。

令人意外的是,我们还需要编写一个 schema 来描述我们将要用来检索这些对象的查询。

示例

说明

在上面的代码片段中,website1 是我们支持查询的对象类型,my_url 是我们将要传递给解析函数的参数,然后 website1 对象在每次请求时调用 resolv_website 函数。

最后一步是创建一个 graphene.Schema 的实例,我们将将其传递给服务器,以描述我们创建的新 API。让我们来看一下下面的代码片段。

示例

完成这些之后,我们就成功地为项目创建了 schema。

完整的代码如下所示:

文件:my_schema.py

Server (服务器版)

现在我们已经编写了 schema,我们可以开始使用 flaskflask-graphql 通过 HTTP 来提供它。

让我们来看一下下面的代码片段来创建一个服务器。

文件:my_server.py

说明

在上面的代码片段中,我们导入了所需的库以及名为 my_schema 的文件,该文件是我们之前创建的。然后,我们使用指定参数为 __name__Flask() 函数来创建应用程序。我们还使用 add_url_rule() 函数添加了不同的 URL 规则,在那里我们指定了不同的参数,最后使用 run() 函数来执行应用程序。

现在我们可以使用以下语法运行服务器:

语法

输入上述语法后,服务器将在 localhost:5000http://127.0.0.1:5000/ 上运行。

结果如下所示:

输出

Serving Flask app "my_server" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

客户

尽管存在 GraphQL 客户端,但我们不需要特殊的 GraphQL 客户端来对新 API 执行 API 请求;我们可以坚持使用我们习惯的 HTTP 客户端,在下面的示例中我们使用了 requests。

文件:my_client.py

输出

{
  "data": {
    "website": {
      "title": "Learn Python Tutorial - javatpoint",
      "image": "https://images.tpointtech.com/images/logo/jtp_logo",
      "description": "Learn Python Tutorial for beginners and profession"
    }
  }
}

说明

在上面的代码片段中,我们导入了 requests 库并定义了一个名为 my_query 的查询,该查询将被发送到服务器。然后,我们定义了一个名为 my_response 的变量,该变量将存储从服务器返回的响应数据。最后,我们打印响应给用户。

用户还可以自定义 my_query 变量的内容,以便检索不同的字段,甚至可以使用别名等来一次检索多个对象。

内省

GraphQL 最强大的方面之一是,其服务器支持内省。内省允许人类和自动化工具理解可用的对象和操作。

这方面的一个很好的例子是,当我们在运行我们构建的示例时,我们可以导航到 http://127.0.0.1:5000 并使用 GraphiQL 直接测试新 API。

这些功能不仅限于 GraphiQL,我们还可以使用与查询新 API 相同的查询界面进行集成。让我们看一个简单的例子,我们询问示例服务公开了哪些可用查询。

服务器的回复将是:

{
  "data": {
    "__type": {
      "fields": [
        {
          "name": "website",
          "args": [{ "name": "url" }]
        }
      ]
    }
  }
}

还有许多其他基于内省的查询,它们写起来非常笨拙;但是,它们为工具构建者提供了巨大的力量。