
Django Rest Framework (DRF) — это мощный набор инструментов для создания RESTful API в Django, популярном веб-фреймворке Python. Он предоставляет набор инструментов и библиотек для упрощения процесса создания API, что упрощает и ускоряет разработку сервисов RESTful.
В этой статье мы рассмотрим основы настройки проекта DRF и выполнения основных операций CRUD (создание, чтение, обновление, удаление). Мы объясним все на простом английском языке, так что даже если вы новичок в Django или RESTful API, вы сможете следовать дальше.
Настройка проекта
Прежде чем мы сможем начать создавать наш API, нам нужно создать новый проект Django. Вы можете сделать это, выполнив следующую команду в своем терминале:
django-admin startproject myproject
Замените «myproject» на то, что вы хотите назвать своим проектом.
После создания проекта нам нужно создать новое приложение для нашего API. Для этого выполните следующую команду:
python manage.py startapp api
Это создаст новый каталог с именем «api» в каталоге вашего проекта, который будет содержать все файлы и код для нашего API.
Далее нам нужно установить DRF. Вы можете сделать это с помощью pip, менеджера пакетов Python, выполнив следующую команду:
pip install djangorestframework
Теперь, когда DRF установлен, нам нужно добавить его в настройки нашего проекта. Откройте файл «settings.py» в каталоге вашего проекта и добавьте следующие строки в конец файла:
INSTALLED_APPS = [
# ...
'rest_framework',
'api',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
]
}
Этот код добавляет DRF и наше приложение «api» в список установленных приложений и устанавливает класс разрешений по умолчанию «AllowAny», что означает, что любой может получить доступ к нашему API. Вы можете изменить это на более безопасный класс разрешений позже.
Теперь мы готовы приступить к созданию нашего API!
Создание модели
Первое, что нам нужно сделать, это создать модель для наших данных. Модель — это класс Python, который определяет структуру и поведение наших данных. В нашем случае мы создадим простую модель «Todo» с полями «название» и «завершено».
Откройте файл «models.py» в каталоге вашего приложения «api» и добавьте следующий код:
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
Этот код определяет новую модель под названием «Todo» с двумя полями: «title», представляющее собой CharField с максимальной длиной 200 символов, и «completed», представляющее собой BooleanField со значением по умолчанию False. Мы также добавили в модель метод «str», который возвращает заголовок элемента списка дел.
Создание сериализатора
Далее нам нужно создать сериализатор для нашей модели. Сериализатор — это класс, который преобразует экземпляры нашей модели в формат JSON, чтобы их можно было легко передавать через Интернет. DRF предоставляет класс Serializer, который мы можем использовать для этой цели.
Создайте новый файл с именем «serializers.py» в каталоге вашего приложения «api» и добавьте следующий код:
from rest_framework import serializers
from .models import Todo
class TodoSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ['id', 'title', 'completed']
Этот код определяет новый сериализатор под названием «TodoSerializer», который наследуется от класса «ModelSerializer» DRF. Мы также добавили в сериализатор класс «Мета», который определяет используемую модель (Todo) и поля, которые необходимо включить в сериализованный вывод (id, title и завершено).
Представления — это сердце любого проекта Django REST Framework. Они определяют поведение вашего API в ответ на входящие запросы. В этом разделе мы создадим представления для нашего приложения Todo, которые обрабатывают операции CRUD (создание, извлечение, обновление, удаление) с использованием APIView DRF.
Создание представлений
Начнем с создания файла «views.py» в каталоге нашего приложения «api». В этом файле мы импортируем класс «APIView» Django REST Framework и нашу модель «Todo», а также создадим представления, которые будут обрабатывать операции CRUD для нашей модели Todo.
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Todo
from .serializers import TodoSerializer
class TodoList(APIView):
def get(self, request):
todos = Todo.objects.all()
serializer = TodoSerializer(todos, many=True)
return Response(serializer.data)
def post(self, request):
serializer = TodoSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class TodoDetail(APIView):
def get_object(self, pk):
try:
return Todo.objects.get(pk=pk)
except Todo.DoesNotExist:
raise Http404
def get(self, request, pk):
todo = self.get_object(pk)
serializer = TodoSerializer(todo)
return Response(serializer.data)
def put(self, request, pk):
todo = self.get_object(pk)
serializer = TodoSerializer(todo, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
todo = self.get_object(pk)
todo.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
В приведенном выше коде мы определяем два представления: TodoList и TodoDetail. Представление TodoList обрабатывает запросы GET и POST для создания и перечисления задач, а представление TodoDetail обрабатывает запросы GET, PUT и DELETE для получения, обновления и удаления определенного элемента задачи.
Мы определяем эти представления, используя класс APIView DRF, который дает нам больший контроль над форматами запроса и ответа по сравнению с использованием общих представлений, таких как ListAPIView или RetrieveAPIView.
Представление TodoList реализует два метода: get и post. В методе get мы извлекаем все объекты Todo из базы данных, сериализуем их с помощью нашего TodoSerializer и возвращаем сериализованные данные в ответ. В методе post мы десериализуем входящую полезную нагрузку JSON, используя наш TodoSerializer, проверяем ее и сохраняем новый объект Todo в базе данных.
Представление TodoDetail реализует четыре метода: get_object, get, put и delete. Метод get_object извлекает объект Todo с указанным первичным ключом (pk) из базы данных и вызывает ошибку 404, если он не существует. В методе get мы извлекаем объект Todo, используя get_object, сериализуем его, используя наш TodoSerializer, и возвращаем сериализованные данные в ответе. В методе put мы извлекаем объект Todo с помощью get_object, десериализуем входящие полезные данные JSON с помощью нашего TodoSerializer, проверяем их и сохраняем обновленный объект Todo в базе данных. В методе delete мы извлекаем объект Todo с помощью get_object и удаляем его из базы данных.
Подключение URL-адресов
Теперь, когда мы создали представления для нашего приложения Todo, нам нужно связать их с URL-адресами нашего проекта Django.
Для этого нам нужно создать файл urls.py в нашем каталоге приложений «api». В этом файле мы определим шаблоны URL, которые сопоставляются с нашими представлениями TodoList и TodoDetail.
from django.urls import path
from .views import TodoList, TodoDetail
urlpatterns = [
path('todos/', TodoList.as_view()),
path('todos/<int:pk>/', TodoDetail.as_view()),
]
В приведенном выше коде мы определяем два шаблона URL: todos/ и todos/<int:pk>/. Шаблон todos/ соответствует нашему представлению TodoList, а шаблон todos/<int:pk>/ соответствует нашему представлению TodoDetail. Часть <int:pk> шаблона URL фиксирует целочисленный первичный ключ (pk) для определенного объекта Todo.
Теперь нам нужно включить наш модуль api.urls в файл urls.py нашего проекта. В файле urls.py проекта добавьте следующий код:
from django.urls import path, include
urlpatterns = [
path('api/', include('api.urls')),
]
Этот код включает модуль api.urls с префиксом пути /api/.
Тестирование нашего API
Теперь, когда мы создали наши представления и шаблоны URL, пришло время протестировать наш API. Мы можем использовать такой инструмент, как Postman или cURL, для отправки HTTP-запросов в наш API и проверки того, что он ведет себя должным образом.
Чтобы протестировать наше представление TodoList, мы можем отправить запрос GET на конечную точку /api/todos/, которая должна вернуть список всех объектов Todo в нашей базе данных. Мы также можем отправить запрос POST на ту же конечную точку с полезной нагрузкой JSON, которая содержит данные для нового объекта Todo. Если запрос выполнен успешно, API должен вернуть ответ 201 Created с сериализованными данными для нового объекта Todo.
Чтобы протестировать наше представление TodoDetail, мы можем отправить запросы GET, PUT и DELETE на конечную точку /api/todos/<pk>/, где <pk> — это первичный ключ определенного объекта Todo. Запрос GET должен возвращать сериализованные данные для указанного объекта Todo, а запрос PUT должен обновлять объект Todo новыми данными и возвращать сериализованные данные для обновленного объекта. Запрос DELETE должен удалить указанный объект Todo из базы данных и вернуть ответ 204 No Content.
Заключение
В этой статье мы увидели, как создать базовый проект Django REST Framework и реализовать операции CRUD с использованием класса APIView. Мы также увидели, как определить шаблоны URL для наших представлений и протестировать наш API с помощью HTTP-запросов. Обладая этими знаниями, вы можете создавать более сложные API-интерфейсы с помощью Django REST Framework, которые интегрируются с другими веб-приложениями и службами.