ویژگی تصویر

ساخت API گراف‌کیوئل با پایتون و GraphQL

  /  پایتون   /  ساخت API گراف کیوئل با پایتون و GraphQL
بنر تبلیغاتی الف

در دنیای توسعه نرم‌افزار، GraphQL به عنوان یک زبان کوئری قدرتمند برای ارتباط با APIها مطرح شده است. در این راهنما، ما به ساخت یک API گراف‌کیوئل با پایتون خواهیم پرداخت. این مقاله به صورت جامع و با تمرکز بر مفاهیم برنامه‌نویسی، منطق و بهترین روش‌ها نوشته شده است.

چرا GraphQL؟

GraphQL یک زبان کوئری برای APIهاست که از طرف فیسبوک توسعه داده شده است. نسخه‌های قبلی APIها معمولاً با REST طراحی می‌شدند و مشکلاتی مثل بار زیاد داده‌ها، تعداد زیاد درخواست‌ها و عدم انعطاف‌پذیری وجود داشت.

  • در GraphQL، کلاینت فقط داده‌های مورد نیاز خود را درخواست می‌دهد.
  • قابلیت پوشش چندین منبع داده در یک کوئری.
  • بازخورد دقیق از سمت سرور در صورت خطا.

پایتون و GraphQL: ابزارها و کتابخانه‌ها

برای ساخت API با GraphQL در پایتون، چندین کتابخانه مفید وجود دارند. اما در این مقاله به استفاده از graphene و Flask خواهیم پرداخت.

  • Graphene: کتابخانه‌ای قدرتمند برای ساخت GraphQL APIها در پایتون.
  • Flask: فریمورک کوچک و انعطاف‌پذیر برای توسعه وب.

نصب و راه‌اندازی محیط

ابتدا نیاز داریم کتابخانه‌های لازم را نصب کنیم:

pip install graphene flask

در این مرحله، ما یک پروژه ساده راه‌اندازی می‌کنیم و در ادامه آن را توسعه خواهیم داد.

ساخت مدل داده در GraphQL

در GraphQL، مدل‌ها با استفاده از Type Definitions تعریف می‌شوند. ما یک کلاس ساده برای کاربر ایجاد خواهیم کرد:

import graphene

class User(graphene.ObjectType):
    id = graphene.Int()
    name = graphene.String()
    email = graphene.String()

class Query(graphene.ObjectType):
    user = graphene.Field(User, id=graphene.Int())

    def resolve_user(self, info, id):
        return User(id=id, name="Ali", email="ali@example.com")

schema = graphene.Schema(query=Query)

در این کد، ما یک نوع داده User تعریف کرده‌ایم که شامل فیلد‌های id, name, و email است. سپس در کلاس Query، یک فیلد user را تعریف کرده‌ایم که یک User با یک شناسه مشخص را برمی‌گرداند. متد resolve_user، داده‌ها را از منبع واقعی (در اینجا ساده) فراخوانی می‌کند.

اجرای API با Flask

برای اجرای API در Flask، نیاز به یک endpoint داریم که کوئری‌ها را دریافت و پاسخ بدهد:

from flask import Flask
from flask_graphql import GraphQLView

app = Flask(__name__)
app.add_url_rule(
    '/graphql',
    view_func=GraphQLView.as_view('graphql', schema=schema, graphiql=True)
)

if __name__ == '__main__':
    app.run(debug=True)

در این قسمت، ما یک endpoint تحت عنوان /graphql در Flask ایجاد کرده‌ایم. graphiql=True به کاربران اجازه می‌دهد تا به صورت آنلاین کوئری‌ها را تست کنند.

پرس‌وجوهای GraphQL

با استفاده از GraphiQL، می‌توانیم یک کوئری ساده اجرا کنیم:

{ 
  user(id: 1) {
    name
    email
  }
}

در این کوئری، ما درخواست می‌دهیم تا اطلاعات کاربر با شناسه ۱ را به ما بدهد. پاسخ به صورت زیر خواهد بود:

{
  "data": {
    "user": {
      "name": "Ali",
      "email": "ali@example.com"
    }
  }
}

بهبود داده‌ها و ساختار کامل

در ادامه، می‌توانیم با استفاده از یک دیتابیس واقعی، ساختار کامل‌تری ایجاد کنیم. برای مثال، فرض کنید که ما یک لیست از کاربران داریم:

شناسهنامایمیل
1علیali@example.com
2حسینhosein@example.com

کد بهبودی شده برای مدل‌های واقعی

در این نسخه، داده‌ها را از یک لیست ساده (برای نمایش) گرفته‌ایم:

users = [
    {"id": 1, "name": "Ali", "email": "ali@example.com"},
    {"id": 2, "name": "Hosein", "email": "hosein@example.com"}
]

class Query(graphene.ObjectType):
    user = graphene.Field(User, id=graphene.Int())
    all_users = graphene.List(User)

    def resolve_user(self, info, id):
        return next((user for user in users if user["id"] == id), None)

    def resolve_all_users(self, info):
        return [User(**user) for user in users]

در این کد، ما یک فیلد جدید all_users اضافه کرده‌ایم که تمام کاربران را برمی‌گرداند. همچنین، متد resolve_user به صورت دقیق‌تر داده‌ها را پیدا می‌کند و اگر کاربر وجود نداشته باشد، None برمی‌گرداند.

بهینه‌سازی عملکرد و مدیریت خطا

در یک سیستم واقعی، لازم است خطاهای احتمالی مدیریت شوند. به عنوان مثال:

def resolve_user(self, info, id):
    user = next((user for user in users if user["id"] == id), None)
    if not user:
        raise Exception("User not found")
    return User(**user)

در این کد، اگر کاربری با شناسه مشخص وجود نداشته باشد، یک خطا پرتاب می‌شود. این روش بهترین عملکرد و رساندن پیام دقیق به کاربر را فراهم می‌کند.

استانداردهای بهتر و توصیه‌ها

  • استفاده از graphene-django یا graphene-sqlalchemy برای ساختارهای بزرگ‌تر.
  • تجزیه و تحلیل عملکرد API با استفاده از GraphQL Playground یا GraphiQL.
  • استفاده از دستورات mutations برای اعمال تغییرات در داده‌ها (به جای تنها کوئری‌ها).

جمع‌بندی

در این مقاله، ما به نحوه ساخت یک API GraphQL با استفاده از پایتون و Flask پرداختیم. ما نشان دادیم که چگونه مدل‌ها، کوئری‌ها و حتی مدیریت خطا در GraphQL به صورت ساده انجام می‌شود. با استفاده از کتابخانه graphene و فریمورک Flask، می‌توانید APIهای قدرتمند و انعطاف‌پذیر بسازید.

اگر نیاز به افزودن قابلیت Mutation یا پیاده‌سازی دیتابیس را دارید، می‌توانید از کتابخانه‌های تخصصی مثل graphene-django استفاده کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: