وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ساخت GraphQL API با جنگو

0 14
زمان لازم برای مطالعه: 12 دقیقه


معرفی

وب APIها موتورهایی هستند که امروزه بیشتر برنامه های ما را تامین می کنند. برای سالیان متمادی REST معماری غالب برای APIها بوده است، اما در این مقاله به بررسی خواهیم پرداخت GraphQL.

با REST API، شما معمولاً برای هر شیء داده ای که در دسترس است URL ایجاد می کنید. فرض کنید در حال ساخت یک REST API برای فیلم‌ها هستیم – برای خود فیلم‌ها، بازیگران، جوایز، کارگردانان، تهیه‌کنندگان نشانی‌های اینترنتی خواهیم داشت… این در حال حاضر سخت شده است! این می تواند به معنای درخواست های زیادی برای یک دسته از داده های مرتبط باشد. تصور کنید که کاربر یک تلفن همراه کم مصرف از طریق اتصال اینترنت کند هستید، این وضعیت ایده آل نیست.

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

GraphQL چیست؟

در ابتدا توسط فیس بوک ایجاد شد اما اکنون تحت عنوان توسعه یافته است بنیاد GraphQL، GraphQL یک زبان پرس و جو و زمان اجرا سرور است که به ما امکان می دهد داده ها را بازیابی و دستکاری کنیم.

ما از سیستم قوی تایپ شده GraphQL برای تعریف داده‌هایی که می‌خواهیم در دسترس API باشند استفاده می‌کنیم. سپس یک طرح واره برای API ایجاد می کنیم – مجموعه ای از پرس و جوهای مجاز برای بازیابی و تغییر داده ها.

طراحی طرحواره فیلم

ایجاد انواع ما

انواع، نوع داده‌های موجود در API را توصیف می‌کنند. قبلاً انواع اولیه ارائه شده است که می توانیم از آنها استفاده کنیم، اما می توانیم انواع سفارشی خود را نیز تعریف کنیم.

انواع زیر را برای بازیگران و فیلم ها در نظر بگیرید:

type Actor {
  id: ID!
  name: String!
}

type Movie {
  id: ID!
  title: String!
  actors: (Actor)
  year: Int!
}

را ID type به ما می گوید که فیلد شناسه منحصر به فرد آن نوع داده است. اگر ID یک رشته نیست، تایپ نیاز به راهی دارد تا به رشته تبدیل شود تا کار کند!

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

شما همچنین متوجه خواهید شد که در Movie ما از هر دو نوع اولیه مانند استفاده می کنیم String و Int و همچنین عرف ما Actor نوع

اگر بخواهیم یک فیلد حاوی لیست نوع باشد، آن را در پرانتز قرار می دهیم – (Actor).

ایجاد پرس و جو

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

type Query {
  actor(id: ID!): Actor
  movie(id: ID!): Movie
  actors: (Actor)
  movies: (Movie)
}

این Query نوع به ما اجازه می دهد تا آن را دریافت کنیم Actor و Movie داده ها با ارائه آنها IDs، یا می توانیم لیستی از آنها را بدون فیلتر دریافت کنیم.

ایجاد جهش

یک جهش توصیف می کند که چه عملیاتی را می توان برای تغییر داده ها انجام داد روی سرور.

جهش ها متکی هستند روی دو چیز:

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

اولین کاری که انجام می دهیم ایجاد انواع ورودی است:

input ActorInput {
  id: ID
  name: String!
}

input MovieInput {
  id: ID
  title: String
  actors: (ActorInput)
  year: Int
}

و سپس انواع بارگذاری را ایجاد می کنیم:

type ActorPayload {
  ok: Boolean
  actor: Actor
}

type MoviePayload {
  ok: Boolean
  movie: Movie
}

توجه داشته باشید ok در فیلد، معمولاً انواع بارگذاری متادیتا مانند وضعیت یا فیلد خطا را شامل می‌شود.

این Mutation نوع همه چیز را با هم جمع می کند:

type Mutation {
  createActor(input: ActorInput) : ActorPayload
  createMovie(input: MovieInput) : MoviePayload
  updateActor(id: ID!, input: ActorInput) : ActorPayload
  updateMovie(id: ID!, input: MovieInput) : MoviePayload
}

این createActor mutator به یک نیاز دارد ActorInput شی، که به نام بازیگر نیاز دارد.

این updateActor mutator نیاز دارد ID بازیگری که به روز می شود و همچنین اطلاعات به روز شده.

همین امر در مورد جهش‌یافته‌های فیلم نیز صدق می‌کند.

توجه داشته باشید: در حالی که ActorPayload و MoviePayload برای یک جهش موفقیت آمیز ضروری نیستند، این تمرین خوبی است که API ها هنگام پردازش یک عمل بازخورد ارائه دهند.

تعریف طرحواره

در نهایت، کوئری‌ها و جهش‌هایی را که ایجاد کرده‌ایم به طرح نگاشت می‌کنیم:

schema {
  query: Query
  mutation: Mutation
}

استفاده از کتابخانه گرافن

GraphQL یک پلتفرم آگنوستیک است، می توان یک سرور GraphQL با انواع زبان های برنامه نویسی (جاوا، PHP، Go)، فریمورک ها (Node.js، Symfony، Rails) یا پلتفرم هایی مانند Apollo ایجاد کرد.

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

راه اندازی برنامه

محیط های مجازی

ایجاد محیط های مجازی برای پروژه های جنگو بهترین روش در نظر گرفته می شود. از پایتون 3.6، venv ماژول برای ایجاد و مدیریت محیط های مجازی گنجانده شده است.

با استفاده از terminalوارد فضای کاری خود شده و پوشه زیر را ایجاد کنید:

$ mkdir django_graphql_movies
$ cd django_graphql_movies/

حال محیط مجازی را ایجاد کنید:

$ python3 -m venv env

شما باید یک جدید ببینید env پوشه در دایرکتوری شما ما باید محیط مجازی خود را فعال کنیم، به طوری که هنگام نصب بسته های پایتون، آنها فقط برای این پروژه در دسترس باشند و نه کل سیستم:

$ . env/bin/activate

توجه داشته باشید: برای خروج از محیط مجازی و استفاده از پوسته معمولی خود تایپ کنید deactivate. این کار را باید در پایان آموزش انجام دهید.

نصب و پیکربندی جنگو و گرافن

در حالی که در محیط مجازی خود استفاده می کنیم pip برای نصب Django و کتابخانه Graphene:

$ pip install Django
$ pip install graphene_django

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

$ django-admin.py startproject django_graphql_movies .

یک پروژه جنگو می تواند از برنامه های زیادی تشکیل شود. برنامه‌ها اجزای قابل استفاده مجدد در یک پروژه هستند و بهترین کار این است که پروژه خود را با آنها ایجاد کنیم. بیایید یک برنامه برای فیلم های خود ایجاد کنیم:

$ cd django_graphql_movies/
$ django-admin.py startapp movies

قبل از اینکه کار کنیم روی برنامه ما یا اجرا شود، پایگاه داده های خود را همگام سازی می کنیم:

# First return to the project's directory
$ cd ..
# And then run the migrate command
$ python manage.py migrate

ایجاد یک مدل

مدل‌های جنگو طرح‌بندی پایگاه داده پروژه ما را توصیف می‌کنند. هر مدل یک کلاس پایتون است که معمولاً به جدول پایگاه داده نگاشت می شود. ویژگی های کلاس به ستون های پایگاه داده نگاشت می شوند.

کد زیر را تایپ کنید django_graphql_movies/movies/models.py:

from django.db import models

class Actor(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name',)

class Movie(models.Model):
    title = models.CharField(max_length=100)
    actors = models.ManyToManyField(Actor)
    year = models.IntegerField()

    def __str__(self):
        return self.title

    class Meta:
        ordering = ('title',)

همانند طرحواره GraphQL، Actor مدل یک نام دارد در حالی که Movie مدل دارای عنوان، رابطه چند به چند با بازیگران و یک سال. شناسه ها به طور خودکار توسط جنگو برای ما تولید می شوند.

اکنون می‌توانیم اپلیکیشن فیلم‌های خود را در پروژه ثبت کنیم. برو django_graphql_movies/settings.py و تغییر دهید INSTALLED_APPS به موارد زیر:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_graphql_movies.movies',
)

حتما پایگاه داده خود را انتقال دهید تا با تغییرات کد ما هماهنگ باشد:

$ python manage.py makemigrations
$ python manage.py migrate

در حال بارگیری داده های آزمایشی

پس از ساختن API خود، می خواهیم بتوانیم پرس و جوهایی را انجام دهیم تا آزمایش کنیم که آیا کار می کند یا خیر. بیایید برخی از داده ها را در پایگاه داده خود بارگذاری کنیم، JSON زیر را به عنوان ذخیره کنید movies.json در پروژه شما root فهرست راهنما:

(
  {
    "model": "movies.actor",
    "pk": 1,
    "fields": {
      "name": "Michael B. Jordan"
    }
  },
  {
    "model": "movies.actor",
    "pk": 2,
    "fields": {
      "name": "Sylvester Stallone"
    }
  },
  {
    "model": "movies.movie",
    "pk": 1,
    "fields": {
      "title": "Creed",
      "actors": (1, 2),
      "year": "2015"
    }
  }
)

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

$ python manage.py loaddata movies.json

باید خروجی زیر را در قسمت مشاهده کنید terminal:

Installed 3 object(s) from 1 fixture(s)

ایجاد طرحواره ما با گرافن

ایجاد پرس و جو

در پوشه برنامه فیلم ما، یک پوشه جدید ایجاد کنید schema.py فایل و بیایید انواع GraphQL خود را تعریف کنیم:

import graphene
from graphene_django.types import DjangoObjectType, ObjectType
from django_graphql_movies.movies.models import Actor, Movie


class ActorType(DjangoObjectType):
    class Meta:
        model = Actor


class MovieType(DjangoObjectType):
    class Meta:
        model = Movie

با کمک Graphene، برای ایجاد یک نوع GraphQL، به سادگی مشخص می کنیم که کدام مدل جنگو دارای ویژگی های مورد نظر ما در API است.

در همین فایل کد زیر را برای ایجاد آن اضافه کنید Query نوع:


class Query(ObjectType):
    actor = graphene.Field(ActorType, id=graphene.Int())
    movie = graphene.Field(MovieType, id=graphene.Int())
    actors = graphene.List(ActorType)
    movies= graphene.List(MovieType)

    def resolve_actor(self, info, **kwargs):
        id = kwargs.get('id')

        if id is not None:
            return Actor.objects.get(pk=id)

        return None

    def resolve_movie(self, info, **kwargs):
        id = kwargs.get('id')

        if id is not None:
            return Movie.objects.get(pk=id)

        return None

    def resolve_actors(self, info, **kwargs):
        return Actor.objects.all()

    def resolve_movies(self, info, **kwargs):
        return Movie.objects.all()

هر خاصیت از Query کلاس مربوط به یک کوئری GraphQL است:

  • را actor و movie خواص یک مقدار از ActorType و MovieType به ترتیب، و هر دو به یک شناسه نیاز دارند که یک عدد صحیح است.

  • را actors و movies خواص لیستی از انواع مربوطه خود را برمی گرداند.

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

در نظر بگیرید resolve_actor تابع. شناسه را از پارامترهای پرس و جو بازیابی می کنیم و بازیگر را از پایگاه داده خود با آن شناسه به عنوان کلید اصلی آن برمی گردانیم. را resolve_actors تابع به سادگی تمام عوامل موجود در پایگاه داده را دریافت می کند و آنها را به عنوان یک لیست برمی گرداند.

ایجاد جهش

هنگامی که طرحواره را طراحی کردیم، ابتدا انواع ورودی ویژه برای جهش های خود ایجاد کردیم. بیایید همین کار را با گرافن انجام دهیم، این را به آن اضافه کنید schema.py:


class ActorInput(graphene.InputObjectType):
    id = graphene.ID()
    name = graphene.String()

class MovieInput(graphene.InputObjectType):
    id = graphene.ID()
    title = graphene.String()
    actors = graphene.List(ActorInput)
    year = graphene.Int()

آنها کلاس های ساده ای هستند که تعیین می کنند از چه فیلدهایی می توان برای تغییر داده ها در API استفاده کرد.

ایجاد جهش به کار کمی بیشتر از ایجاد پرس و جو نیاز دارد. بیایید جهش های بازیگران را اضافه کنیم:


class CreateActor(graphene.Mutation):
    class Arguments:
        input = ActorInput(required=True)

    ok = graphene.Boolean()
    actor = graphene.Field(ActorType)

    @staticmethod
    def mutate(root, info, input=None):
        ok = True
        actor_instance = Actor(name=input.name)
        actor_instance.save()
        return CreateActor(ok=ok, actor=actor_instance)

class UpdateActor(graphene.Mutation):
    class Arguments:
        id = graphene.Int(required=True)
        input = ActorInput(required=True)

    ok = graphene.Boolean()
    actor = graphene.Field(ActorType)

    @staticmethod
    def mutate(root, info, id, input=None):
        ok = False
        actor_instance = Actor.objects.get(pk=id)
        if actor_instance:
            ok = True
            actor_instance.name = input.name
            actor_instance.save()
            return UpdateActor(ok=ok, actor=actor_instance)
        return UpdateActor(ok=ok, actor=None)

امضای را به خاطر بیاورید createActor جهش زمانی که طرحواره خود را طراحی کردیم:

createActor(input: ActorInput) : ActorPayload
  • نام کلاس ما با نام کوئری GraphQL مطابقت دارد.
  • درونی Arguments خصوصیات کلاس با آرگومان های ورودی mutator مطابقت دارد.
  • این ok و actor خواص را تشکیل می دهند ActorPayload.

نکته کلیدی که هنگام نوشتن الف باید بدانید mutation روش این است که شما داده ها را ذخیره می کنید روی مدل جنگو:

  • نام را از شی ورودی می گیریم و یک نام جدید ایجاد می کنیم Actor هدف – شی.
  • ما به save عملکرد را به گونه ای انجام دهید که پایگاه داده ما به روز شود و بار را به کاربر برگرداند.

این UpdateActor کلاس دارای تنظیمات مشابه با منطق اضافی برای بازیابی بازیگری است که در حال به روز رسانی است و ویژگی های آن را قبل از ذخیره تغییر می دهد.

حالا بیایید جهش فیلم ها را اضافه کنیم:


class CreateMovie(graphene.Mutation):
    class Arguments:
        input = MovieInput(required=True)

    ok = graphene.Boolean()
    movie = graphene.Field(MovieType)

    @staticmethod
    def mutate(root, info, input=None):
        ok = True
        actors = ()
        for actor_input in input.actors:
          actor = Actor.objects.get(pk=actor_input.id)
          if actor is None:
            return CreateMovie(ok=False, movie=None)
          actors.append(actor)
        movie_instance = Movie(
          title=input.title,
          year=input.year
          )
        movie_instance.save()
        movie_instance.actors.set(actors)
        return CreateMovie(ok=ok, movie=movie_instance)


class UpdateMovie(graphene.Mutation):
    class Arguments:
        id = graphene.Int(required=True)
        input = MovieInput(required=True)

    ok = graphene.Boolean()
    movie = graphene.Field(MovieType)

    @staticmethod
    def mutate(root, info, id, input=None):
        ok = False
        movie_instance = Movie.objects.get(pk=id)
        if movie_instance:
            ok = True
            actors = ()
            for actor_input in input.actors:
              actor = Actor.objects.get(pk=actor_input.id)
              if actor is None:
                return UpdateMovie(ok=False, movie=None)
              actors.append(actor)
            movie_instance.title=input.title
            movie_instance.year=input.year
            movie_instance.save()
            movie_instance.actors.set(actors)
            return UpdateMovie(ok=ok, movie=movie_instance)
        return UpdateMovie(ok=ok, movie=None)

به عنوان بازیگران مرجع فیلم، ما باید قبل از ذخیره، داده های بازیگر را از پایگاه داده بازیابی کنیم. این for حلقه ابتدا تأیید می کند که بازیگرهای ارائه شده توسط کاربر واقعاً در پایگاه داده هستند، در غیر این صورت بدون ذخیره هیچ داده ای برمی گردد.

هنگام کار با روابط چند به چند در جنگو، ما فقط می توانیم داده های مرتبط را ذخیره کنیم بعد از اینکه شی ما ذخیره شد.

به همین دلیل است که ما فیلم خود را با آن ذخیره می کنیم movie_instance.save() قبل از تنظیم بازیگران به آن با movie_instance.actors.set(actors).

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

class Mutation(graphene.ObjectType):
    create_actor = CreateActor.Field()
    update_actor = UpdateActor.Field()
    create_movie = CreateMovie.Field()
    update_movie = UpdateMovie.Field()

ساخت طرحواره

همانطور که قبلاً هنگام طراحی طرحواره خود، پرس و جوها و جهش ها را به API برنامه خود نگاشت می کنیم. این را به آخر اضافه کنید schema.py:

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

ثبت طرحواره در پروژه

برای اینکه API ما کار کند، باید طرحی را به صورت گسترده در دسترس قرار دهیم.

جدید ایجاد کنید schema.py فایل در django_graphql_movies/ و موارد زیر را اضافه کنید:

import graphene
import django_graphql_movies.movies.schema

class Query(django_graphql_movies.movies.schema.Query, graphene.ObjectType):
    
    
    pass

class Mutation(django_graphql_movies.movies.schema.Mutation, graphene.ObjectType):
    
    
    pass

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

از اینجا می توانیم گرافن را ثبت کنیم و به آن بگوییم که از طرح ما استفاده کند.

باز کن django_graphql_movies/settings.py و اضافه کنید 'graphene_django', به عنوان اولین مورد در INSTALLED_APPS.

در همان فایل کد زیر را چند خط جدید در زیر اضافه کنید INSTALLED_APPS:

GRAPHENE = {
    'SCHEMA': 'django_graphql_movies.schema.schema'
}

API های GraphQL از طریق یک نقطه پایانی به دست می آیند، /graphql. ما باید آن مسیر یا بهتر بگوییم مشاهده را در جنگو ثبت کنیم.

باز کن django_graphql_movies/urls.py و محتویات فایل را به:

from django.contrib import admin
from django.urls import path
from graphene_django.views import GraphQLView
from django_graphql_movies.schema import schema

urlpatterns = (
    path('admin/', admin.site.urls),
    path('graphql/', GraphQLView.as_view(graphiql=True)),
)

تست API ما

برای آزمایش API خود، اجازه دهید پروژه را اجرا کنیم و سپس به نقطه پایانی GraphQL برویم. در terminal نوع:

$ python manage.py runserver

هنگامی که سرور شما در حال اجرا است، به آن مراجعه کنید http://127.0.0.1:8000/graphql/. مواجه خواهید شد GraphiQL – یک IDE ساخته شده برای اجرای پرس و جوهای شما!

نوشتن پرس و جو

برای اولین پرس و جو، بیایید همه بازیگران در پایگاه داده خود را دریافت کنیم. در قسمت بالا سمت چپ موارد زیر را وارد کنید:

query getActors {
  actors {
    id
    name
  }
}

این فرمت پرس و جو در GraphQL است. ما با query کلمه کلیدی، به دنبال آن یک نام اختیاری برای پرس و جو. این تمرین خوبی است که به پرس و جوها یک نام بدهید زیرا به ورود به سیستم و اشکال زدایی کمک می کند. GraphQL به ما اجازه می دهد تا فیلدهایی را که می خواهیم نیز مشخص کنیم – ما انتخاب کردیم id و name.

حتی اگر فقط یک فیلم در داده های آزمایشی خود داریم، بیایید آن را امتحان کنیم movie پرس و جو کنید و یکی دیگر از ویژگی های عالی GraphQL را کشف کنید:

query getMovie {
  movie(id: 1) {
    id
    title
    actors {
      id
      name
    }
  }
}

این movie پرس و جو نیاز به یک شناسه دارد، بنابراین ما یکی را در براکت ارائه می کنیم. نکته جالب همراه با actors رشته. در مدل جنگو خود ما آن را گنجانده ایم actors دارایی در ما Movie کلاس و رابطه چند به چند را بین آنها مشخص کرد. این به ما اجازه می دهد تا تمام ویژگی های an را بازیابی کنیم Actor نوع مربوط به داده های فیلم است.

این پیمایش نمودار مانند داده ها دلیل اصلی این است که GraphQL یک فناوری قدرتمند و هیجان انگیز در نظر گرفته می شود!

جهش های نوشتن

جهش ها از سبکی مشابه به عنوان پرس و جو پیروی می کنند. بیایید یک بازیگر به پایگاه داده خود اضافه کنیم:

mutation createActor {
  createActor(input: {
    name: "Tom Hanks"
  }) {
    ok
    actor {
      id
      name
    }
  }
}

توجه کنید که چگونه input پارامتر مربوط به input خواص از Arguments کلاس هایی که قبلا ایجاد کردیم

همچنین توجه داشته باشید که چگونه ok و actor برگرداندن مقادیر به ویژگی های کلاس از CreateActor جهش

حالا می‌توانیم فیلمی را اضافه کنیم که تام هنکس در آن بازی کرده است:

mutation createMovie {
  createMovie(input: {
    title: "Cast Away",
    actors: (
      {
        id: 3
      }
    )
    year: 1999
  }) {
    ok
    movie{
      id
      title
      actors {
        id
        name
      }
      year
    }
  }
}

متاسفانه ما فقط اشتباه کردیم. “Cast Away” در سال 2000 اکران شد!

بیایید یک کوئری به روز رسانی برای رفع آن اجرا کنیم:

mutation updateMovie {
  updateMovie(id: 2, input: {
    title: "Cast Away",
    actors: (
      {
        id: 3
      }
    )
    year: 2000
  }) {
    ok
    movie{
      id
      title
      actors {
        id
        name
      }
      year
    }
  }
}

وجود دارد، همه چیز ثابت است!

ارتباط از طریق POST

GraphiQL در طول توسعه بسیار مفید است، اما غیرفعال کردن این دیدگاه در تولید، امری استاندارد است زیرا ممکن است به یک توسعه‌دهنده خارجی بینش بیش از حد نسبت به API اجازه دهد.

برای غیرفعال کردن GraphiQL، به سادگی ویرایش کنید django_graphql_movies/urls.py به طوری که path('graphql/', GraphQLView.as_view(graphiql=True)), تبدیل می شود path('graphql/', GraphQLView.as_view(graphiql=False)),.

برنامه ای که با API شما ارتباط برقرار می کند، درخواست های POST را به آن ارسال می کند /graphql نقطه پایانی قبل از اینکه بتوانیم درخواست های POST را از خارج از سایت جنگو انجام دهیم، باید تغییر دهیم django_graphql_movies/urls.py:

from django.contrib import admin
from django.urls import path
from graphene_django.views import GraphQLView
from django_graphql_movies.schema import schema
from django.views.decorators.csrf import csrf_exempt 

urlpatterns = (
    path('admin/', admin.site.urls),
    path('graphql/', csrf_exempt(GraphQLView.as_view(graphiql=True))),
)

جنگو به صورت داخلی همراه است CSRF محافظت (جعل درخواست متقابل سایت) – اقداماتی برای جلوگیری از انجام اقدامات مخرب احتمالی توسط کاربران تأیید شده نادرست سایت دارد.

در حالی که این محافظت مفید است، از برقراری ارتباط برنامه های خارجی با API جلوگیری می کند. اگر برنامه خود را در مرحله تولید قرار دهید، باید اشکال دیگری از احراز هویت را در نظر بگیرید.

در شما terminal برای دریافت همه بازیگران موارد زیر را وارد کنید:

$ curl \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{ "query": "{ actors { name } }" }' \
  http://127.0.0.1:8000/graphql/

شما باید دریافت کنید:

{"data":{"actors":({"name":"Michael B. Jordan"},{"name":"Sylvester Stallone"},{"name":"Tom Hanks"})}}

نتیجه

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

با Graphene می توانیم از جنگو برای ایجاد GraphQL API استفاده کنیم. ما طرح فیلمی را که قبلا طراحی کرده بودیم پیاده سازی کردیم و آن را با استفاده از جستارهای GraphQL از طریق GraphiQL و یک درخواست استاندارد POST آزمایش کردیم.

اگر می‌خواهید کد منبع برنامه کامل را ببینید، می‌توانید آن را پیدا کنید اینجا.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-25 20:45:14

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید