Создать Backend GraphQL A PI
В первой части статьи мы создали проект Django с приложением item, включающим нашу модель фильма.
В этой части мы создадим простой API с GraphQL, который будет отвечать на запросы, запрашиваемые нашим клиентским приложением.
Шаг 1: создание приложения API
Давайте создадим наше второе приложение, которое будет отвечать за GraphQL API.
Оболочка
xxxxxxxxxx
1
# djr/
2
# create app with the name gql
3
# (name is not necessarily to be gql)
4
python manage.py startapp gql
Шаг 2: Настройте конечные точки URL и необходимые настройки
Добавьте конечную точку URL, через которую будут выполняться все запросы API.
Примечание: опция (graphiql = True) отвечает за интерактивный браузер GraphQL API. Мы будем использовать его для ручного запроса к базе данных.
питон
xxxxxxxxxx
1
from django.contrib import admin
2
from django.urls import path
3
from graphene_django.views import GraphQLView
4
from django.views.decorators.csrf import csrf_exempt
5
from django.views.generic import TemplateView
6
7
urlpatterns = [
8
path('admin/', admin.site.urls),
9
10
# apiclient on client-side will request this adress later
11
path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True))),
12
13
14
# index.html file will be our root template. When a user opens our webste,
15
# this file will be sent by server at first. After then, api requests
16
# will directed above address.
17
18
# (it points to ~/Blog/djr/templates/index.html)
19
# (currently there is no file, webpack production bundle will come here )
20
path("", TemplateView.as_view(template_name="index.html")),
21
]
Вам также может понравиться:
Использование REST API с помощью React.js
Определите расположение схемы для Graphene в файле settings.py вашего проекта Django. Расположение SCHEMA указывает на нашу схему, которую мы создадим через мгновение.
питон
xxxxxxxxxx
1
# djr/djr/settings.py
2
GRAPHENE = {
3
'SCHEMA': 'gql.schema.schema'
4
}
Создайте файл schema.py в каталоге gql.
питон
xxxxxxxxxx
1
# djr/gql/schema.py
2
import graphene
3
4
# this is what we define SCHEMA in settings.py
5
schema = graphene.Schema(query=Query)
Шаг 3: Определите модель API и запрос
Теперь мы должны четко определить запросы API и соответствующие им типы данных.
Сначала мы создадим тип модели API и его преобразователи, которые будут интерфейсом нашей ранее определенной модели фильма.
Вы также можете определить пользовательские типы с помощью graphene.ObjectType, который не связан ни с какой предопределенной Django-моделью.
API-модель
Когда мы создаем API-модель, мы сначала определяем поля API-модели относительно нашей исходной модели фильма. Не обязательно определять все поля, но мы сделаем. Кроме того, вы можете написать пользовательские поля, которые не были определены ранее.
Давайте посмотрим, как соединяются поля модели нашего фильма и поля модели API.
Resolvers
После полей мы определим распознаватели, которые отвечают за логическую часть. Второй аргумент распознавателей — это информационный аргумент, который содержит полезную информацию, такую как информация об аутентификации или HTTP.
Запросы
Теперь мы собираемся написать наши запросы. Клиентское приложение выполнит свои запросы в соответствии с этими запросами. Для простоты будут определены только два запроса.
Запрос movie_list возвращает все фильмы в базе данных.
Запрос фильма возвращает только определенный фильм, если фрагмент URL-адреса совпадает с любым полем фрагмента фильма.
Окончательный код файла schema.py находится здесь:
питон
xxxxxxxxxx
1
import graphene
2
from items.models import Movie
3
from graphene_django.types import DjangoObjectType
4
5
# api-movie-model
6
class MovieType(DjangoObjectType):
7
id = graphene.Int()
8
name = graphene.String()
9
year = graphene.Int()
10
summary = graphene.String()
11
poster_url = graphene.String()
12
slug = graphene.String()
13
14
class Meta:
15
model = Movie
16
17
def resolve_id(self, info):
18
return self.id
19
20
def resolve_name(self, info):
21
return self.name
22
23
def resolve_year(self, info):
24
return self.year
25
26
def resolve_summary(self, info):
27
return self.summary
28
29
def resolve_poster_url(self, info):
30
# Note: in client side app snake_case fields
31
# will be resolved as camelCase
32
# Eg: poster_url ==> posterUrl
33
return self.poster_url
34
35
def resolve_slug(self, info):
36
return self.slug
37
38
39
class Query(graphene.ObjectType):
40
movie_list = graphene.List(MovieType)
41
movie = graphene.Field(MovieType, slug=graphene.String())
42
43
def resolve_movie_list(self, info, *_):
44
# for large lists only query what you need
45
return Movie.objects.all().only("name", "poster_url", "slug")
46
47
def resolve_movie(self, info, slug):
48
movie_queryset = Movie.objects.filter(slug=slug)
49
if movie_queryset.exists():
50
return movie_queryset.first()
51
52
schema = graphene.Schema(query=Query)
Написание API для бэкэнда закончено. Теперь мы можем проверить это в интерактивном браузере GraphQL.
Шаг 3: Интерактивная игровая площадка GraphQL
Пожалуйста, запустите сервер и откройте http://127.0.0.1:8000/graphql в браузере и напишите это. Вы увидите ответ на этот запрос.
Оболочка
xxxxxxxxxx
1
query {
2
#the query name
3
movieList{
4
# the fields which we will request
5
id,
6
name,
7
posterUrl, #camelCase
8
}
9
}
Наш второй запрос имеет аргументы. Мы можем сделать запрос следующим образом:
питон
xxxxxxxxxx
1
query {
2
#the query and argument
3
movie(slug:"the-matrix-1999"){
4
# the fields which we will request
5
id,
6
name,
7
posterUrl, #camelCase
8
9
}
10
}
тогда ответ будет
JSON
xxxxxxxxxx
1
{
2
"data": {
3
"movie": {
4
"id": 2571,
5
"name": "The Matrix",
6
"posterUrl": "<https://image.tmdb.org/t/p/w185/lZpWprJqbIFpEV5uoHfoK0KCnTW.jpg>"
7
}
8
}
9
}
Мы проверили, что наш API готов. Эта часть урока закончена. Вы можете остановить сервер.
Далее мы создадим одностраничное приложение с React. Затем мы делаем запросы к нашему бэкэнду.
Дальнейшее чтение
Интеграция Spring Boot и реагирование с Spring Security: базовая аутентификация и аутентификация JWT