杭州电子商务研究院

使用 Ariadne GraphQL 和 Django 开发微服务

2020-10-19 08:00飞浪

介绍

大多数现代应用程序都是以解耦的方式开发的。前端和后端是独立的应用程序,通常通过应用程序编程接口 (API) 连接。这使得 API 和 API 开发知识至关重要。

借助强大的 API,后端系统可以为多个前端客户端提供服务。这些客户端可以是 Web 客户端,也可以是移动客户端。

本指南假设您对 API 和 Django Web 框架有基本的了解,并且至少具有中级水平的 Python 和 GraphQL 能力。

有关 Django 的入门指南可在此处找到。

Ariadne GraphQL

Ariadne GraphQL是 Python 版graphql的解释。它由软件公司Mirumee开发。其主要目的是解决石墨烯的缺点。

要安装 Ariadne 和 GraphQL 核心,请在终端上运行以下命令。

      pip install ariadne graphql-core
    

示例应用程序

在本练习中,您将开发一个 Django 应用,用于显示来自默认 Sqlite3 数据库的数据。数据是学校及其人口的列表。

首先,通过运行以下命令启动一个新的 Django 项目。

      django-admin startproject school_list
    

接下来,使用以下命令创建一个应用程序并将其命名为school_stats。

      python3 manage.py startapp school_stats
    

应用程序现已设置完毕。剩下的就是开发学校模型、由查询和变异组成的 Ariadne GraphQL 模式,以及配置 URL 以显示 GraphQL 游乐场界面。下面的代码块显示了模型以及构成数据库表的字段。将代码块复制到models.py文件中。

      from django.db import models

class School(models.Model):
   school_name = models.CharField(max_length=20)
   school_population = models.IntegerField(default=100)
   added_on = models.DateTimeField(auto_now_add=True)
   
   def __str__(self):
       return self.school_name
    

该模型需要数据。要添加数据,您需要访问管理面板。这需要超级用户访问权限。下一步是使用以下命令创建超级用户帐户。

      python manage.py createsuperuser
    

这是一个交互式过程,您将提供必要的详细信息并注册您的用户。要使应用程序和模型可见,需要在 Django 项目和admin.py中注册它们。要注册应用程序以及第三方应用程序 Ariadne,请将其名称添加到settings.py中已安装的应用程序列表中。

将下面的列表复制到您的settings.py并替换现有列表。

      INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'school_stats',
    "ariadne.contrib.django",
]
    

为了确保School模型在管理窗格上可见,请在admin.py文件中注册它。将下面的代码块添加到您的admin.py文件中。

      from django.contrib import admin
from .models import School
admin.site.register(School)
    

GraphQL Schema 和解析器

开发 GraphQL 部分的第一步是开发架构。在您的架构中,您将有一个用于添加学校的变异、一个School输入对象、一个用于查看学校的查询以及一个将作为查询结果返回的School对象。由于架构很简单,您可以创建一个文件内架构。下面的代码块定义了架构并分配了type_defs变量。在school_stats应用程序中,创建一个文件并将其命名为resolver.py。添加以下块。

      type_defs= """

type Query{
    all_schools: [School]
}

type School {
    id: ID
    school_name: String!
    school_population: Int!

}
type Mutation{
    add_school(input: SchoolInput): SchoolResults

}
input SchoolInput {
    school_name: String
    school_population: Int
}
  type SchoolResults {
        created: Boolean!
        school: School
        err: String
}

"""
    

GraphQL 查询

要设置查询,您需要从模型返回数据。这需要在架构中创建的查询all_schools的查询解析器。在您的resolver.py文件中,添加以下函数。

      from ariadne import QueryType, make_executable_schema, MutationType
from .models import School
query = QueryType()

@query.field('all_schools')
def resolve_schools(*_):
    return School.objects.all()
    

GraphQL 变更

与查询类似,为将在数据库中创建记录的变异设置一个解析器。

      mutation = MutationType()

@mutation.field('add_school')
def resolve_add_school(_,info, input):

    school = School.objects.create(school_name=input['school_name'], school_population=input['school_population'])      
    return {'created': True, 'school': school, 'err': None}
    

使架构可执行

要执行该模式并使其可在 GraphQL 游乐场中使用,请添加以下代码行。

      schema = make_executable_schema(type_defs, query, mutation)
    

URL 配置

要配置 URL,请配置主项目的urls.py文件以使用路径函数将任何流量引导至 school_stats 应用程序,如下面的代码块所示。

      from django.urls import path, include
from django.contrib import admin
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('school_stats.urls')),

]
    

接下来,创建一个urls.py文件并将 graphQL 视图和模式加载到默认 URL。

      from django.urls import path, include
from ariadne.contrib.django.views import GraphQLView
from .resolver import schema
urlpatterns = [
    path('graphql/', GraphQLView.as_view(schema=schema), name='graphql'),
    path('', GraphQLView.as_view(schema=schema), name='graphql'),
]
    

运行应用程序

一切设置完成后,最后一步是迁移更改并运行服务器。要进行迁移,请运行以下命令:

      python manage.py makemigrations
    

要将模型更改迁移到默认数据库,请运行以下命令:

      python manage.py migrate
    

要启动服务器并运行应用程序,请运行以下命令:

      python manage.py runserver
    

API 屏幕

样本突变

在 GraphQL 环境中,执行以下变更以创建记录。要创建更多记录,请更改变量。

      mutation {
  add_school(input: {school_name:"SchoolZ", school_population:330})
  {
    created
    school{
      school_name
      school_population
    }
    err
  }
}
    

示例查询

      query{
  all_schools{
    school_name
    school_population
  }
}
    

结论

API 开发这一重要技能可应用于后端开发人员、API/中间件开发人员和全栈开发人员等职位。

Ariadne GraphQL 是一个相对较新的软件包,它有一些有趣的用例。要进一步巩固这些基础知识,请遵循这些Django 集成和Flask 集成指南,了解如何使用 Django、Flask 和 Ariadne GraphQL 开发微服务。

曝光26353浏览1405