How to Build a REST API in Django

Если вы создаете веб-приложение или мобильное приложение для мобильных устройств, скорее всего, вам понадобится способ отправки и получения данных между вашим приложением и сервером.

Вот тут-то и пригодятся REST API. Они помогают приложениям взаимодействовать друг с другом – вроде как официант принимает у вас заказ и приносит еду обратно. И если вы используете Django, вы уже на полпути к успеху.

Django - один из самых популярных веб-фреймворков в мире. Он быстрый, безопасный и оснащен полезными инструментами. Объедините его с Django REST Framework (DRF), и у вас будет все необходимое для создания надежного REST API, не тратя недели на то, чтобы разобраться во всем этом.

В этом руководстве я расскажу вам обо всем процессе создания REST API в Django с нуля.

О чем мы расскажем:

  1. Что такое REST API?

  2. Инструменты, которые Вам понадобятся

  3. Как создать REST API в Django

  4. Разрешения DRF

  5. Часто задаваемые вопросы

  6. Заключительные мысли

Что такое 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 – Перейдите в новый каталог вашего проекта.

  • python manage.py startapp 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 для экономии вашего времени.

  1. TaskListCreate:

    • Обрабатывает запросы GET для получения списка всех задач.

    • Обрабатывает запросы POST для создания новых задач.

  2. 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 позволяет сэкономить массу времени — вам не придется каждый раз изобретать велосипед.

Дополнительные ресурсы

Хотите продолжать учиться? Вот несколько важных моментов, в которых стоит копнуть глубже:

Вернуться на верх