Создание кастомных представлений
REST Framework предоставляет класс APIView, который строит функциональность API поверх класса Django's View. Класс APIView отличается от View при использовании настраиваемых объектов Request и Response REST Framework и обрабатывает исключения APIException для возврата соответствующих ответов HTTP. Он также имеет встроенную систему аутентификации и авторизации для управления доступом к представлениям.
Мы собираемся создать представление, для регистрации пользователей на курсах. Измените api/views.py и добавьте в него следующий код:
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from ..models import Course
class CourseEnrollView(APIView):
def post(self, request, pk, format=None):
course = get_object_or_404(Course, pk=pk)
course.students.add(request.user)
return Response({'enrolled': True})
CourseEnrollView View обрабатывает регистрацию пользователей на курсы. Давайте разберем этот класс ближе:
- Мы создаем кастомное представление, подкласса APIView.
- Мы определяем метод post() для действий POST. Для этого представления не будет разрешено ни один ни другй метод HTTP.
- Мы ожидаем параметр pk URL, содержащий идентификатор курса. Мы извлекаем курс по заданному параметру pk и вызываем исключение 404, если курс не найден.
- Мы добавляем текущего пользователя students в отношение «многие ко многим» для объекта Course и возвращаем успешный отклик.
Отредактируйте файл api/urls.py и добавьте следующий URL шаблон для представления CourseEnrollView:
url(r'^courses/(?P<pk>\d+)/enroll/$', views.CourseEnrollView.as_view(), name='course_enroll'),
Теоретически, теперь можно выполнить запрос POST, чтобы зарегистрировать текущего пользователя на курс. Однако мы должны быть в состоянии идентифицировать пользователя и предотвратить доступ пользователей, не прошедших аутентификацию, к этому представлению. Посмотрим, как работает аутентификация и разрешения API.