از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ساخت GraphQL API با جنگو
سرفصلهای مطلب
معرفی
وب 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
داده ها با ارائه آنها ID
s، یا می توانیم لیستی از آنها را بدون فیلتر دریافت کنیم.
ایجاد جهش
یک جهش توصیف می کند که چه عملیاتی را می توان برای تغییر داده ها انجام داد روی سرور.
جهش ها متکی هستند روی دو چیز:
- ورودی ها – انواع خاص فقط زمانی به عنوان آرگومان در یک جهش استفاده می شود که بخواهیم یک شی کامل را به جای فیلدهای مجزا ارسال کنیم.
- محموله ها – انواع معمولی، اما طبق قرارداد ما از آنها به عنوان خروجی برای یک جهش استفاده می کنیم تا بتوانیم به راحتی آنها را با تکامل 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