DjangoでGraphQLの実装 [Graphene]

2019年12月1日

DjangoでWeb APIであるGraphQLを実装してみます。

 

本記事ではDjangoにおいてGraphQLサーバを構築するためのGrapheneライブラリーを利用し、単一のエンドポイントを作成します。またそのエンドポイントに対してREST APIのGETメソッドに該当するクエリ(query)を実行し、結果(レスポンス)が返ってくることを確認します。データベースはDjangoに備わっているSQLiteを利用しています。

 

環境

Mac OS

Django==2.2.6

graphene==2.1.8

 

 

Grapheneをインストールします。

 

myprojectプロジェクトおよびmyappアプリケーションの作成済みを前提に話を進めていきます。

 

settings.pyのINSTALLED_APPSの項目にgraphene_djangoを設定します。

 

myproject/myproject/settings.py

さらに下記項目を追記します。

 

 

モデルの定義


 

今回は単純に独立した2つのモデルを用意しました。マイグレーションファイルの作成・実行をし、あらかじめ管理サイト等でデータを登録しておいて下さい(手順は関連ページをご覧下さい)。

 

myproject/myapp/models.py

 

関連ページ

SQLiteを利用する

 

 

 

スキーマの定義


 

myappディレクトリ内にschema.pyを作成し、下記のように編集します。

 

myproject/myapp/schema.py

DjangoObjectTypeをサブクラス化し、2つのモデルからそれぞれのタイプ(MemberType、ClubType)を作成します。Queryクラスにはmembersおよびmember、そしてclubsをスキーマのフィールドとして記述しています。例えばmembersはすべてのmemberオブジェクト、memberはidを引数とした特定のmemberオブジェクトが格納されます。最後に各フィールドに対応したリゾルバ関数(resolve_フィールド名())を記述することによって、フィールドの値を返すようにします。

 

 

myprojectディレクトリ内(ルートディレクトリ直下ではありません)にもschema.pyを作成し、下記のように編集します。

 

myproject/myproject/schema.py

 

 

エンドポイント


 

最後にurls.pyを編集し、エンドポイントを有効にします。

 

myproject/myproject/urls.py

8行目

CSRF対策を無効にしています。無効にしないと例えばcurlによってデータを取得できません(後述)。またgraphiql=Trueを設定すると、ブラウザでGraphiQLの画面を表示させることができます(下記画像参照)。

 

以上で「http://localhost:8000/graphql/」がGraphQLのエンドポイントとなり、クエリを実行することが可能となります。実際にブラウザでGraphiQLの画面を表示して、クエリを実行すると、JSONオブジェクトが返ってくることを確認できます。仮にnameやnicknameを含めずにクエリを実行すると、それらクエリと同じ構造を持つJSONオブジェクトが返ってきます。

 

クエリの記述。

GraphiQL画面

 

idが2の結果のみを取得します。

↓ 結果例

 

clubsのクエリも実行してみます。

↓ 結果例

 

 

 

最後にGraphQLのエンドポイントに対してcurlを叩きJSONデータを取得してみます。日本語化等のコマンド(perl〜)は各自の環境において指定して下さい。

 

 

関連ページ

GraphQLのMutationで新規作成

 

 

 

参照ページ


 

graphql-python Tutorial – Introduction

 

GraphQL

Schemas and Types

 

Graphene-Python

Basic Tutorial

 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー