はじめに
Grapheneのチュートリアルを参考にしています。
GraphQLとは、以下のようなものです。
GraphQLはAPIのクエリ言語であり、データに対して定義したタイプシステムを使用してクエリを実行するためのサーバー側のランタイムです。GraphQLは特定のデータベースやストレージエンジンに縛られておらず、代わりに既存のコードとデータによってバックアップされています。
ptyhonでGraphQLを実装するには、Grapheneというツールが必要です。
Grapheneは、PythonでGraphQL APIを実装するためのツールを提供するライブラリです。
実装
今回の実装はdockerを使いました。
githubのレポジトリーです。
ファイル構成
.
├── docker-compose.yml
└── opt
├── Dockerfile
├── main.py
└── requirements.txt
解説
dockerfile
FROM python:3.8.8-buster
USER root
RUN apt-get update
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
ENV PYTHONPYCACHEPREFIX=/root/pycache
RUN apt-get install -y vim less sqlite3
RUN pip install --upgrade pip --user
RUN pip install --upgrade setuptools --user
WORKDIR /root/opt
COPY . .
docker-compose.yml
version: "3"
services:
web:
build: ./opt
container_name: "flask"
tty: true
volumes:
- ./opt:/root/opt
ports:
- 8080:8080
requirements.txt
numpy==1.16.0
requests==2.23.0
Flask==2.2.2
Flask-Cors==3.0.10
graphene==3.2.1
Grapheneのスキーマ
{
hello(name: "friend")
}
helloは飛び出すスキーマ名です。かっこの中は引数です。
この形で呼び出します。
resolve_helloでスキーマと連携された関数です。
main.py
from graphene import ObjectType, String, Schema, Int
from flask import Flask, request, jsonify
from flask_cors import CORS
import json
app = Flask(__name__)
CORS(app)
class Query(ObjectType):
hello = String(name=String(default_value="bob"))
def resolve_hello(root, info, name):
return f'My name is {name}'
schema = Schema(query=Query)
@app.route('/', methods=['POST'])
def hello():
data = json.loads(request.data)
result = schema.execute(data['query']).data
return json.dumps(result)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080)