この記事では、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開発が行えるでしょう。
コメント