اگر در حال ساخت برنامه ای با Django هستید و به فکر استفاده از GraphQL هستید ، تنها نیستید.

REST سالهاست که به کار خود ادامه می دهد ، اما GraphQL به سرعت در حال تبدیل شدن به گزینه مورد علاقه برای توسعه دهندگان است که می خواهند انعطاف پذیری بیشتری داشته باشند و کمتر از عقب و جلو بین Frontend و Backend.

من زمان زیادی را صرف کار با Django و بازی با روش های مختلف برای نرم تر کردن API ها کردم و به همین دلیل مردم به GraphQL می روند.

شما دقیقاً داده های مورد نیاز خود را درخواست می کنید ، و همین کار را می کنید. بدون کرک اضافی ، هیچ درخواست متعدد برای جمع کردن داده ها – این مانند سفارش دادن یک منو و گرفتن دقیقاً همان چیزی است که می خواستید ، هر بار.

بنابراین ، اگر در مورد روش ساخت یک API GraphQL با استفاده از Django کنجکاو هستید ، من شما را تحت پوشش قرار داده ام.

من شما را از طریق آنچه GraphQL است ، قدم می زنم ، چرا ممکن است در بعضی موارد مناسب تر از استراحت باشد ، و اینکه چگونه می توانید از ابتدا شروع کنید – حتی اگر شما یک متخصص GraphQL نیستید (هنوز).

این چیزی است که ما پوشش خواهیم داد:

  1. GraphQL چیست ، و چرا اهمیت دارد؟

  2. آنچه شما قبل از شروع به آن نیاز دارید

  3. روش ساخت یک API GraphQL در Django)

  4. روش اضافه کردن جهش (همچنین به عنوان نوشتن داده نیز شناخته می شود)

  5. Code Walkthrough: ایجاد یک پست از طریق جهش در GraphQL)

  6. چگونه مشتری از این استفاده می کند

  7. جوانب مثبت و منفی استفاده از GraphQL در جنگو

  8. متداول

  9. چه چیزی بعدی؟

  10. افکار نهایی

GraphQL چیست ، و چرا اهمیت دارد؟

GraphQL یک زبان پرس و جو برای API است – و مهمتر از همه ، این یک زمان اجرا برای انجام آن نمایش داده ها با داده های شما است.

این توسط فیس بوک در سال 2012 ساخته شد و در سال 2015 عمومی شد. از آن زمان توسط شرکت هایی مانند Github ، Shopify ، Twitter و Pinterest استفاده می شود.

بر خلاف استراحت ، جایی که شما اغلب برای به دست آوردن تمام داده های مورد نیاز خود مجبور به درخواست های متعدد هستید ، GraphQL به شما امکان می دهد تمام داده های خود را در یک درخواست واحد واکشی کنید.

این یک کار بزرگ است ، به خصوص برای برنامه های تلفن همراه یا شبکه های کند که درخواست های کمتری به معنای عملکرد بهتر است.

پیشنهاد می‌کنیم بخوانید:  چگونه یک سیستم توصیه فیلم بر اساس فیلتر مشارکتی بسازیم

بیایید بگوییم که شما می خواهید نام کاربر ، تصویر پروفایل و 3 پست وبلاگ اخیر آنها باشد. با استراحت ، ممکن است نیاز به ضربه 2-3 نقطه پایانی مختلف داشته باشید. با graphql؟ یک درخواست ، انجام شده است.

همچنین برای Frontend Devs بسیار عالی است زیرا آنها می توانند داده هایی را که به آنها باز می گردند شکل دهند ، بدون اینکه منتظر بمانند برای ایجاد نقاط پایانی جدید.

آنچه شما قبل از شروع به آن نیاز دارید

قبل از پریدن ، آنچه در اینجا باید داشته باشید:

  • دانش اساسی Django (مدل ها ، نماها و غیره روی)

  • پایتون نصب شده (3.8+ بهترین است)

  • یک پروژه Django راه اندازی شده است

  • pip یا pipenv برای مدیریت بسته بندی

اگر تازه شروع می کنید ، می توانید یک پروژه جدید Django را با:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

روش ساخت API GraphQL در Django

بیایید وارد آن شویم.

1. نصب گرافن-دیجانگو

گرافن محبوب ترین کتابخانه برای استفاده از GraphQL با پایتون است. برای Django به طور خاص ، بسته ای به نام وجود دارد graphene-djangoبشر

می توانید آن را مانند این نصب کنید:

pip install graphene-django

سپس ، آن را به خود اضافه کنید INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'graphene_django',
]

2. یک مدل ساده اضافه کنید

در اینجا یک مدل سریع برای کار با آن وجود دارد. در myapp/models.py:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    published = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

سپس مهاجرت های خود را اجرا کنید:

python manage.py makemigrations
python manage.py migrate

3. یک طرحواره ایجاد کنید

در myapp/schema.py، با:

import graphene
from graphene_django.types import DjangoObjectType
from .models import Post

class PostType(DjangoObjectType):
    class Meta:
        model = Post

class Query(graphene.ObjectType):
    all_posts = graphene.List(PostType)

    def resolve_all_posts(root, info):
        return Post.objects.all()

schema = graphene.Schema(query=Query)

سپس ، در تنظیمات پروژه Django خود ، اضافه کنید:

GRAPHENE = {
    "SCHEMA": "myapp.schema.schema"
}

و سرانجام ، در خود urls.py:

from django.urls import path
from graphene_django.views import GraphQLView
from django.views.decorators.csrf import csrf_exempt

urlpatterns = [
    path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True))),
]

اکنون ، بازدید کنید http://localhost:8000/graphql و این پرس و جو را امتحان کنید:

{
  allPosts {
    title
    content
    published
  }
}

رونق شما فقط با استفاده از GraphQL از پایگاه داده خود پرس و جو کردید.

در اینجا به نظر می رسد که زمین بازی GraphQL شما باید به نظر برسد.

8820E7DD-FF86-4C7D-9C8C-EC21DC43B09B

روش اضافه کردن جهش (همچنین به عنوان نوشتن داده نیز شناخته می شود)

GraphQL فقط برای خواندن داده ها نیست. همچنین می توانید ایجاد ، بروزرسانی و حذف کنید. در اینجا روش اضافه کردن یک جهش برای ایجاد یک پست آورده شده است:

در myapp/schema.py:

class CreatePost(graphene.Mutation):
    class Arguments:
        title = graphene.String(required=True)
        content = graphene.String(required=True)

    post = graphene.Field(PostType)

    def mutate(self, info, title, content):
        post = Post(title=title, content=content)
        post.save()
        return CreatePost(post=post)

class Mutation(graphene.ObjectType):
    create_post = CreatePost.Field()

schema = graphene.Schema(query=Query, mutation=Mutation)

اکنون ، در زمین بازی GraphiQl ، می توانید اجرا کنید:

mutation {
  createPost(title: "My First Post", content: "Hello GraphQL!") {
    post {
      id
      title
    }
  }
}

بسیار تمیز ، درست است؟

Walkthrough Code: ایجاد یک پست از طریق جهش در GraphQL

بگذارید شما را از طریق کد قدم بزنم ، توضیح دهم که چه کاری انجام می دهد و چگونه GraphQL باعث می شود کار کند.

مرحله 1: CreatePost کلاس جهش

class CreatePost(graphene.Mutation):
    class Arguments:
        title = graphene.String(required=True)
        content = graphene.String(required=True)

    post = graphene.Field(PostType)

    def mutate(self, info, title, content):
        post = Post(title=title, content=content)
        post.save()
        return CreatePost(post=post)

اینجا چه می گذرد روی در این قسمت:

  • graphene.Mutation: این یک رسم را تعریف می کند جهش، که در GraphQL روش تغییر داده های سمت سرور (مشابه ارسال ، قرار دادن و حذف در حالت استراحت) است.

  • class Arguments: این را به عنوان قسمت “ورودی” جهش فکر کنید. ما به title وت content، هر دو به عنوان رشته. اینها همان چیزی است که مشتری هنگام فراخوانی جهش باید ارائه دهد.

  • post = graphene.Field(PostType): این نوع بازگشت جهش را تعریف می کند. در این حالت ، پس از ایجاد یک پست ، ما آن را با استفاده از یک نوع GraphQL سفارشی به نام باز می گردانیم PostTypeبشر

  • mutate(self, info, title, content): این روش هنگام اجرای جهش نامیده می شود. در داخل آن:

    • ما یک جدید ایجاد می کنیم Post نمونه مدل

    • ما آن را در پایگاه داده ذخیره می کنیم.

    • ما نتیجه جهش را به عنوان یک برگردانیم CreatePost شی با پست جدید پیوست شده.

  • این منطق را محکم ، خواندنی و قابل آزمایش نگه می دارد – نمونه ای عالی از طراحی API تمیز.

پیشنهاد می‌کنیم بخوانید:  چگونه یک سیستم کنترل موشک بسازیم: نظریه کنترل پایه با پایتون

مرحله 2: سیم کشی جهش در طرحواره

class Mutation(graphene.ObjectType):
    create_post = CreatePost.Field()

این جایی است که ما ثبت نام جهش ما در GraphQL ، کلیه عملیات (نمایش داده شد و جهش) باید بخشی از طرحواره باشد. با اضافه کردن create_post به Mutation کلاس ، ما آن را در نقطه پایانی GraphQL قرار می دهیم.

مرحله 3: طرح نهایی

schema = graphene.Schema(query=Query, mutation=Mutation)

در این کد ،

  • ما در حال ایجاد یک جدید هستیم graphene.Schemaبشر

  • ما در یک Query کلاس (فرض می شود که در جای دیگری برای عملیات خواندن تعریف شده است) و ما Mutation کلاس برای عملیات نوشتن.

این معادل گرافیک سیم کشی Django است urls.py – این همان چیزی است که هنگام برخورد به شما در معرض مشتری قرار می گیرد /graphql/ نقطه پایانی

چگونه مشتری از این استفاده می کند

مشتری (ابزار آزمایش Frontend یا API مانند بی خوابی/پستچی) جهش مانند این را ارسال می کند:

mutation {
  createPost(title: "GraphQL is Awesome", content: "Let's build APIs with it!") {
    post {
      id
      title
      content
    }
  }
}

و پاسخی مانند:

{
  "data": {
    "createPost": {
      "post": {
        "id": "1",
        "title": "GraphQL is Awesome",
        "content": "Let's build APIs with it!"
      }
    }
  }
}

جایزه: چرا این برای توسعه دهندگان بسیار جذاب است

  • تیم های Frontend هم اکنون می تواند فرم ها را بسازد و فوراً ساختار پاسخ را مشاهده کند.

  • Devs Backend آنچه را مجاز است تعریف کنید و فقط منطق لازم را کنترل کنید.

  • دیگر داده های بیش از حد یا کم تحرک – GraphQL فقط آنچه را که می خواهید به شما می دهد.

  • آسان برای آزمایش ، اشکال زدایی و مقیاس.

حتماً موارد زیر را در جای خود داشته باشید

  • اطمینان حاصل کنید که دارید graphene-django نصب شده

  • اضافه کردن 'graphene_django' به شما INSTALLED_APPSبشر

  • طرح را در پروژه Django خود سیم کشی کنید urls.pyبشر

from django.urls import path
from graphene_django.views import GraphQLView
from myapp.schema import schema

urlpatterns = [
    path("graphql/", GraphQLView.as_view(graphiql=True, schema=schema)),
]

جوانب مثبت و منفی استفاده از GraphQL در جنگو

جوانب مثبت:

  • نمایش داده های انعطاف پذیر

  • عالی برای devs frontend

  • کمتر تماس API

  • طرحواره به شدت تایپ شده

  • عملکرد بهتر روی شبکه های کندتر

منفی ها:

  • منحنی یادگیری کمی تندتر

  • تنظیم بیشتر از استراحت

  • برای API های ساده می تواند بیش از حد باشد

متداول

آیا GraphQL بهتر از استراحت است؟

بستگی دارد GraphQL کنترل و انعطاف پذیری بیشتری به شما می دهد ، اما استراحت راحت تر و تنظیم ساده تر برای پروژه های کوچک است.

آیا گرافن تنها راه استفاده از GraphQL با Django است؟

نه همچنین می توانید از آریادن یا توت فرنگی استفاده کنید. اما گرافن بالغ ترین و در حال حاضر مورد استفاده قرار می گیرد.

آیا GraphQL با چارچوب REST Django خوب کار می کند؟

آنها می توانند در کنار هم زندگی کنند. اگر قبلاً یک API REST دارید و می خواهید GraphQL را اضافه کنید ، نیازی به پرتاب چیزی نیست.

چه چیزی بعدی؟

پس از پایین آمدن اصول ، می توانید:

  • با JWT یا Sessions احراز هویت را اضافه کنید

  • در صورت نیاز به صفحه بندی و فیلتر کردن از رله استفاده کنید

  • API GraphQL خود را برای واکنش ، VUE یا هر جبهه وصل کنید

افکار نهایی

اگر مدتی است که از Django استفاده کرده اید و می خواهید API خود را کمی قدرت و انعطاف پذیری بیشتری به خود بدهید ، GraphQL 100 ٪ ارزش بررسی دارد.

منابع بیشتر

  • اسناد گرافن-دیجانگو

  • اسناد رسمی GraphQL

  • Ariadne-یک کتابخانه طرح گرافیکی اول برای پایتون

  • GraphQL در مقابل استراحت: تفاوت های کلیدی