lecture's People
lecture's Issues
GraphQL API
Было принято решение отойти от идеологии REST в пользу GraphQL.
В #23 я настроила библиотеку graphene_django
и добавила несколько контроллеров.
Нужно переписать все остальные контроллеры (в идеале, и тесты).
Предлагаю начать с контроллеров для курсов.
Затем взяться за обновление/удаление/получение комментариев (добавление я уже сделала для образца).
Небольшой гайд по graphene_django:
Контроллеры пишутся в файле schema.py
.
Вместо сериализаторов теперь GraphQL типы. Они используются как для сериализации, так и для формирования документации:
from graphene_django import DjangoObjectType
from .models import Course
class CourseType(DjangoObjectType):
class Meta:
model = Course
# можно использовать fields и exclude
GET контроллеры объявляются в типе Query
:
import graphene
from .models import Course, Progress
class Query(graphene.ObjectType):
courses = graphene.List(CourseType)
progress = graphene.List(ProgressType)
def resolve_courses(self, info):
return Course.objects.all()
def resolve_progress(self, info):
return Progress.objects.filter(user=info.context.user)
Вначале идёт описание контроллеров в формате название = возвращаемоеЗначение
.
Далее следуют методы, которые производят обработку соответствующих запросов.
Проще некуда.
Протестировать это можно в GraphiQL IDE (которая находится по адресу localhost:8000/graphql
(очень советую поиграться там).
Например:
{
courses { # запросить список курсов с приложенными id и name
id
name
}
}
Пример контроллера с параметрами:
class CommentType(DjangoObjectType):
class Meta:
model = Comment
class Query(graphene.ObjectType):
comments = graphene.List(CommentType,
# имена и типы параметров:
lecture_id=graphene.Int(required=True),
slide_id=graphene.Int(required=True),
)
# параметры передаются в виде kwargs ^-^
def resolve_comments(self, info, lecture_id, slide_id):
return Comment.objects.filter(lecture_id=lecture_id, slide_id=slide_id)
Проверки параметров на None делаются автоматически. Сейчас мы пишем их вручную.
Каждый обработчик, который совершает изменение в бд (в терминах gql это называется мутацией), пишется в отдельном классе:
class CreateComment(graphene.Mutation):
class Arguments:
text = graphene.String(required=True)
slide_id = graphene.Int(required=True)
lecture_id = graphene.Int(required=True)
comment = graphene.Field(CommentType) # возвращаемое значение
def mutate(self, info, text, slide_id, lecture_id):
return CreateComment(comment=Comment.objects.create(
user=info.context.user,
text=text,
slide_id=slide_id,
lecture_id=lecture_id,
))
Затем такие классы объединяются в одном типе Mutation:
class Mutation(graphene.ObjectType):
create_comment = CreateComment.Field()
update_comment = UpdateComment.Field()
Полный гайд: https://docs.graphene-python.org/projects/django/en/latest/tutorial-plain/
Вход в аккаунт не работает
Как сейчас в SigninView
проверяется соотвествие пароля:
if user.password == password:
return credentials(request, user)
При этом user.password
зашифрован, а password
(который достаётся из запроса) — нет.
Это значит, что зайти в свой аккаунт невозможно, даже если указать верные данные.
Тесты проходят, потому что юзер создаётся через create:
def setUp(self):
User.objects.create(
username=user['name'], email=user['email'], password=user['password']
)
Это тоже нужно поправить.
Course views
Благодаря #15 курсы хранятся в бд. Теперь нужно определить вьюшки, чтобы доставать их оттуда.
Нам нужно:
- Получение списка всех курсов
- Получение лекций по id курса
- Получение слайдов по id лекции
Комментарии должны присылаться вместе с автором
Скрипт синхронизации не должен стирать все данные
Такую строчку содержит скрипт:
Course.objects.all().delete()
Она удаляет все существующие курсы, после чего они добавляются в бд заново, НО при этом им присваиваются новые id, и все связанные модели становятся неактуальными.
Вместо этого предлагаю такой алгоритм:
- Получить список всех курсов из бд (обозначим его
α
) - Узнать название курса из папки
courses
- Посмотреть, содержит ли
α
курс с таким названием - Если содержит, обновить его через update, иначе сделать insert
- В конце пройтись по
α
и удалить все записи, которых в папке нет
Я создала ветку (#21) и добавила туда тест.
Он запускает скрипт дважды, после чего сравнивает параметры сгенерированных объектов.
Сейчас он падает из-за того, что id объектов, полученных после первого прохода, не совпадает с id объектов, полученных во второй раз.
Если удастся сделать, чтобы тест не падал, то, вероятно, работу можно считать выполненной. (См).
Синхронизация лекций с бд
Так как лекции не хранятся в бд, мы теряем автоматическую валидацию целостности.
Например, комментарий можно оставить к несуществующей лекции.
Кроме того, id лекций не определяется автоматически и не присылается клиенту (без него оставить комментарий невозможно).
- Переделать формат лекций, чтобы их можно было синхронизировать с бд
- Написать алгоритм синхронизации
User info view
После авторизации в cookie клиента сохраняется зашифрованный id сесии.
Благодаря этому сервер может ассоциировать клиента с его аккаунтом.
Прекрасно! Но на фронтенде из кук невозможно достать информацию об аккунте (например, никнейм).
Поэтому нужно создать отдельный контроллер, который возвращает её.
Только чтобы он не присылал пароль, пожалуйста. Я думаю, достаточно ограничиться никнеймом и email .
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.