از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش ساخت API GraphQL در Django

سرفصلهای مطلب
اگر در حال ساخت برنامه ای با Django هستید و به فکر استفاده از GraphQL هستید ، تنها نیستید.
REST سالهاست که به کار خود ادامه می دهد ، اما GraphQL به سرعت در حال تبدیل شدن به گزینه مورد علاقه برای توسعه دهندگان است که می خواهند انعطاف پذیری بیشتری داشته باشند و کمتر از عقب و جلو بین Frontend و Backend.
من زمان زیادی را صرف کار با Django و بازی با روش های مختلف برای نرم تر کردن API ها کردم و به همین دلیل مردم به GraphQL می روند.
شما دقیقاً داده های مورد نیاز خود را درخواست می کنید ، و همین کار را می کنید. بدون کرک اضافی ، هیچ درخواست متعدد برای جمع کردن داده ها – این مانند سفارش دادن یک منو و گرفتن دقیقاً همان چیزی است که می خواستید ، هر بار.
بنابراین ، اگر در مورد روش ساخت یک API GraphQL با استفاده از Django کنجکاو هستید ، من شما را تحت پوشش قرار داده ام.
من شما را از طریق آنچه GraphQL است ، قدم می زنم ، چرا ممکن است در بعضی موارد مناسب تر از استراحت باشد ، و اینکه چگونه می توانید از ابتدا شروع کنید – حتی اگر شما یک متخصص GraphQL نیستید (هنوز).
این چیزی است که ما پوشش خواهیم داد:
-
GraphQL چیست ، و چرا اهمیت دارد؟
-
آنچه شما قبل از شروع به آن نیاز دارید
-
روش ساخت یک API GraphQL در Django)
-
روش اضافه کردن جهش (همچنین به عنوان نوشتن داده نیز شناخته می شود)
-
Code Walkthrough: ایجاد یک پست از طریق جهش در GraphQL)
-
چگونه مشتری از این استفاده می کند
-
جوانب مثبت و منفی استفاده از GraphQL در جنگو
-
متداول
-
چه چیزی بعدی؟
-
افکار نهایی
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 شما باید به نظر برسد.
روش اضافه کردن جهش (همچنین به عنوان نوشتن داده نیز شناخته می شود)
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 در مقابل استراحت: تفاوت های کلیدی
منتشر شده در 1404-04-16 22:04:05