FlaskでGraphQLを効率的に活用する完全ガイド

この記事では、PythonのFlaskフレームワークでGraphQLを利用する方法について詳しく解説します。具体的なコード例とその解説、応用例を含めています。

目次

なぜFlaskでGraphQLか?

Flaskは軽量なWebフレームワークであり、GraphQLはデータ取得と操作のための柔軟なクエリ言語です。この二つを組み合わせることで、効率的なAPI開発が可能となります。

GraphQLの基本

GraphQLはFacebookによって開発されたクエリ言語です。REST APIとは異なり、クライアント側で取得するデータを柔軟に指定できる点が特徴です。

Flaskの特長

FlaskはPythonで書かれた軽量なWebフレームワークであり、小規模から大規模なプロジェクトまで対応しています。拡張性が高く、多くのライブラリとの連携が容易です。

環境構築

必要なパッケージ

  • Python 3.x
  • Flask
  • Graphene

インストール

# FlaskとGrapheneのインストール
pip install Flask
pip install Graphene

基本的な実装

スキーマの定義

GraphQLでは、スキーマを定義してデータの構造を指定します。

from graphene import ObjectType, String, Int

# スキーマの定義
class Query(ObjectType):
    hello = String(name=String(default_value="world"))
    age = Int()

    def resolve_hello(self, info, name):
        return f"Hello {name}"

    def resolve_age(self, info):
        return 30

Flaskとの統合

次に、FlaskとGraphQLのスキーマを統合します。

from flask import Flask
from graphene import ObjectType, String, Schema
from flask_graphql import GraphQLView

app = Flask(__name__)

# スキーマの生成
schema = Schema(query=Query)

# GraphQLエンドポイントの設定
app.add_url_rule("/graphql", view_func=GraphQLView.as_view("graphql", schema=schema, graphiql=True))

if __name__ == "__main__":
    app.run()

応用例

データベースとの連携

FlaskとSQLAlchemyを用いてデータベースと連携する例です。

from graphene import ObjectType, String, Int, List, Field
from graphene_sqlalchemy import SQLAlchemyObjectType
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class UserModel(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(256))

class User(SQLAlchemyObjectType):
    class Meta:
        model = UserModel

class Query(ObjectType):
    users = List(User)

    def resolve_users(self, info):
        query = User.get_query(info)
        return query.all()

認証機能の追加

JWTを用いて認証機能を追加する例です。

from flask_jwt_extended import JWTManager, jwt_required

app.config["JWT_SECRET_KEY"] = "super-secret" 
jwt = JWTManager(app)

class Query(ObjectType):
    protected_field = String()

    @jwt_required()
    def resolve_protected_field(self, info):
        return "You can see this because you are authorized."

まとめ

この記事ではFlaskとGraphQLを組み合わせた基本的な使い方から応用例までを解説しました。特にデータベース連携と認証機能の追加により、実用的なAPI開発が行えるでしょう。

コメント

コメントする

目次