How to Build a REST API in Django
Если вы создаете веб-приложение или мобильное приложение для мобильных устройств, скорее всего, вам понадобится способ отправки и получения данных между вашим приложением и сервером.
Вот тут-то и пригодятся REST API. Они помогают приложениям взаимодействовать друг с другом – вроде как официант принимает у вас заказ и приносит еду обратно. И если вы используете Django, вы уже на полпути к успеху.
Django - один из самых популярных веб-фреймворков в мире. Он быстрый, безопасный и оснащен полезными инструментами. Объедините его с Django REST Framework (DRF), и у вас будет все необходимое для создания надежного REST API, не тратя недели на то, чтобы разобраться во всем этом.
В этом руководстве я расскажу вам обо всем процессе создания REST API в Django с нуля.
О чем мы расскажем:
Что такое REST API?
Прежде чем мы начнем, давайте проясним одну вещь: что вообще такое REST API?
REST API (сокращение от “Передача состояния представления”) – это способ взаимодействия двух систем, таких как веб–сайт и сервер, с помощью стандартных HTTP-методов, таких как GET, POST, PUT и DELETE.
Допустим, у вас есть приложение для выполнения текущих задач. Вы хотите:
-
Получить список задач
-
Добавить новую задачу
-
Обновить задачу
-
Удалить задачу
Все это можно сделать с помощью REST API. Это похоже на настройку собственного меню команд, которое другие приложения (или ваш интерфейс) могут использовать для работы с вашими данными.
Инструменты, которые вам понадобятся:
Вот что вы будете использовать в этом руководстве:
-
Python (предпочтительно 3.8+)
-
Django (веб-фреймворк)
-
Фреймворк Django REST (DRF) (для создания API)
-
Почтальон или локон (для тестирования)
Вы можете установить DRF с помощью:
pip install djangorestframework
Как создать REST API в Django
Вот как начать:
Шаг 1: Настройте свой проект на Django
Если вы еще этого не сделали, запустите новый проект на Django:
django-admin startproject myproject
cd myproject
python manage.py startapp api
-
django-admin startproject myproject– Создает новый проект Django с именемmyproject, который содержит файлы конфигурации для всего вашего сайта. -
cd myproject– Перейдите в новый каталог вашего проекта. -
pythonmanage.pystartapp api– Создает новое приложение Django с именемapi, в котором будут работать ваши модели, представления и логика API.
Теперь добавьте 'rest_framework' и 'api' к вашему INSTALLED_APPS в settings.py:
INSTALLED_APPS = [
...
'rest_framework',
'api',
]
-
rest_frameworkэто фреймворк Django REST, который предоставляет вам инструменты для простого создания API. -
'api'указывает Django искать в папкеapiмодели, представления и так далее.
Шаг 2: Создайте модель
Давайте создадим простую модель – список задач.
В api/models.py:
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
-
title: Короткий фрагмент текста (например, “Купить продукты”).CharFieldиспользуется для строк. -
completed: Логическое значение (True или False), указывающее, выполнена ли задача. -
__str__: Этот специальный метод возвращает строковую версию модели при печати – полезно для отладки и панели администратора.
Затем выполните:
python manage.py makemigrations
python manage.py migrate
-
makemigrations: Подготавливает изменения в схеме базы данных. -
migrate: Применяет эти изменения к реальной базе данных.
Шаг 3: Создайте сериализатор
Сериализаторы преобразуют вашу модель Django в JSON (формат данных, используемый в API) и обратно.
В api/serializers.py:
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = '__all__'
-
Сериализаторы преобразуют экземпляры модели (например,
Task) в JSON и обратно, чтобы их можно было отправлять через Интернет. -
ModelSerializerэто ярлык, который автоматически обрабатывает большинство задач в зависимости от вашей модели. -
fields = '__all__'средства включают в себя все поля в модели (заголовок и заполненные).
Шаг 4: Создайте представления
Вот в чем логика. Вы можете использовать представления на основе классов или функций. Давайте рассмотрим представления на основе классов, используя DRF generics.
В api/views.py:
from rest_framework import generics
from .models import Task
from .serializers import TaskSerializer
class TaskListCreate(generics.ListCreateAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
Это общие представления на основе классов, предоставляемые платформой Django REST Framework для экономии вашего времени.
-
TaskListCreate:-
Обрабатывает запросы GET для получения списка всех задач.
-
Обрабатывает запросы POST для создания новых задач.
-
-
TaskDetail:- Дескрипторы ПОЛУЧАЮТ для одной задачи, СТАВЯТ/ИСПРАВЛЯЮТ для обновления и УДАЛЯЮТ, чтобы удалить задачу
Шаг 5: Настройка URL-адресов
Сначала создайте файл urls.py в папке api (если он не существует).
В api/urls.py:
from django.urls import path
from .views import TaskListCreate, TaskDetail
urlpatterns = [
path('tasks/', TaskListCreate.as_view(), name='task-list'),
path('tasks/<int:pk>/', TaskDetail.as_view(), name='task-detail'),
]
-
tasks/: Маршрут для доступа к задачам или их создания. -
tasks/<int:pk>/: Маршрут для получения, обновления или удаления отдельной задачи по ее первичному ключу (pk).
Затем, в вашем главном myproject/urls.py:
Теперь подключите это к главному urls.py в папке вашего проекта:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]
Шаг 6: Протестируйте его!
Запустите сервер:
python manage.py runserver
Откройте Postman или curl и попробуйте перейти к этим конечным точкам:
-
GET /api/tasks/– получить все задания -
POST /api/tasks/– создайте новую задачу -
GET /api/tasks/1/– получите конкретное задание -
PUT /api/tasks/1/– обновить задачу -
DELETE /api/tasks/1/– удалить задачу
И все – у вас есть работающий REST API.
Эта настройка предоставляет вам полнофункциональный REST API всего с несколькими строками кода, благодаря платформе Django REST Framework. Теперь вы должны понимать:
-
Как модели определяют структуру вашей базы данных
-
Как сериализаторы преобразуют модели в JSON и наоборот
-
Как представления управляют поведением API (получают, публикуют, обновляют, удаляют)
-
Как маршрутизация URL связывает ваши просмотры с веб-запросами
Разрешения DRF
Прямо сейчас любой может использовать ваш API. Но что, если вы хотите, чтобы доступ был только у определенных пользователей?
DRF предоставляет вам простые способы справиться с этим. Например, чтобы сделать API доступным только для зарегистрированных пользователей:
from rest_framework.permissions import IsAuthenticated
class TaskListCreate(generics.ListCreateAPIView):
...
permission_classes = [IsAuthenticated]
Есть и другие разрешения, которые вы можете использовать, например, IsAdminUser пользовательские разрешения.
Давайте разберем это и углубимся в разрешения в Django REST Framework (DRF), включая:
Что такое разрешения в DRF?
Разрешения в DRF control кто может получить доступ к вашему API и какие действия они могут выполнять (чтение, запись, удаление и т.д.).
Они применяются для каждого вида (или набора представлений) и проверяются после аутентификации, что означает, что они основаны на проверке того, вошел ли пользователь в систему.
Общие встроенные разрешения
DRF предоставляет вам несколько очень полезных встроенных классов разрешений "из коробки":
1. IsAuthenticated
Это гарантирует, что только зарегистрированные пользователи смогут получить доступ к представлению:
from rest_framework.permissions import IsAuthenticated
class TaskListCreate(generics.ListCreateAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = [IsAuthenticated]
Только пользователи, прошедшие проверку подлинности (например, с помощью входа в сеанс или токена), смогут составлять список или создавать задачи. Все остальные получат 403 Forbidden ответ.
2. IsAdminUser
Разрешает доступ только в том случае, если user.is_staff True.
from rest_framework.permissions import IsAdminUser
class AdminOnlyView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAdminUser]
Только пользователи с правами администратора (обычно задаются с помощью статуса администратора Django или суперпользователя) могут получить доступ к этому представлению.
3. AllowAny
Разрешает всем пользователям, даже не прошедшим проверку подлинности. Это значение по умолчанию для открытых API, таких как страницы регистрации.
from rest_framework.permissions import AllowAny
class PublicSignupView(generics.CreateAPIView):
serializer_class = SignupSerializer
permission_classes = [AllowAny]
4. IsAuthenticatedOrReadOnly
Прошедшие проверку пользователи могут читать и записывать, не прошедшие проверку пользователи могут только читать (GET, HEAD, OPTIONS).
from rest_framework.permissions import IsAuthenticatedOrReadOnly
class ArticleView(generics.RetrieveUpdateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
Пример использования: Отлично подходит для блогов или API-интерфейсов статей, где общественность может читать, но только зарегистрированные пользователи могут писать / обновлять.
Пользовательские разрешения
Хотите получить больше контроля? Вы можете создать свои разрешения, создав подклассы BasePermission.
Пример: разрешить редактировать объект только его владельцам
from rest_framework.permissions import BasePermission
class IsOwner(BasePermission):
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
Затем используйте это следующим образом:
class TaskDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = [IsAuthenticated, IsOwner]
-
Во-первых, пользователь должен войти в систему (
IsAuthenticated). -
Тогда только владелец этого конкретного
Taskможет просматривать, обновлять или удалять его.
Объединение разрешений
Вы можете объединить несколько классов разрешений, и все они должны возвращать True для предоставления доступа.
permission_classes = [IsAuthenticated, IsAdminUser]
Это означает, что пользователь должен быть аутентифицирован и иметь права администратора.
TL;DR
| Permission | Who Gets Access? |
AllowAny |
Everyone (even logged-out users) |
IsAuthenticated |
Only logged-in users |
IsAdminUser |
Only admin/staff users |
IsAuthenticatedOrReadOnly |
Read: everyone / Write: only logged-in users |
Custom Permissions |
Your rules (e.g., only owners) |
Часто задаваемые вопросы
Нужен ли мне фреймворк Django REST для создания API на Django?
Технически, нет, но DRF значительно облегчает вашу жизнь. Без DRF вам пришлось бы вручную обрабатывать такие вещи, как:
-
Анализ и проверка JSON-запросов
-
Запись представлений для сериализации объектов Python в JSON
-
Управление кодами состояния HTTP и ответами
-
Управление аутентификацией и разрешениями самостоятельно
Короче говоря, вам придется изобретать велосипед заново, но DRF сделает все это за вас, используя гораздо меньше кода.
Могу ли я использовать этот API с интерфейсом React или Vue?
Безусловно. Ваш Django API будет отправлять и получать данные в формате JSON — именно для этого и предназначены современные интерфейсные фреймворки, такие как React и Vue. Просто убедитесь, что вы правильно обрабатываете CORS (совместное использование ресурсов разных источников).
Как мне ускорить работу моего API?
Вы можете:
-
Используйте кэширование для хранения частых ответов
-
Включите разбиение на страницы, чтобы уменьшить нагрузку на данные
-
Изучите асинхронные просмотры (Django 3.1+ поддерживает асинхронность) для ускорения ввода-вывода
DRF также предлагает встроенные инструменты для разбивки на страницы, регулирования и других настроек производительности "из коробки".
Заключительные мысли
Создание REST API в Django может показаться сложной задачей, но это всего лишь серия небольших, выполнимых шагов.
Сделав это один раз, в следующий раз будет намного проще. Кроме того, использование фреймворка Django REST позволяет сэкономить массу времени — вам не придется каждый раз изобретать велосипед.
Дополнительные ресурсы
Хотите продолжать учиться? Вот несколько важных моментов, в которых стоит копнуть глубже: