Создание кастомных представлений

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.

results matching ""

    No results matching ""