JavaRush /Курсы /Модуль 3: Django /Создание первого API с DRF

Создание первого API с DRF

Модуль 3: Django
16 уровень , 3 лекция
Открыта

Сегодня мы создадим свой первый API с помощью DRF. И вот как мы будем это делать:

  1. Создадим модель данных.
  2. Определим сериализатор для преобразования данных.
  3. Напишем представление для обработки запросов.
  4. Настроим маршруты.
  5. И наконец, протестируем API.

Если вы готовы, заваривайте кофе и пристегивайтесь. Полет в мир API начинается!

1. Подготовка: модель данных

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

Добавим в наше приложение (назовем его blog) модель Article, которая будет представлять статьи.

# blog/models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)  # Заголовок статьи
    content = models.TextField()             # Содержимое статьи
    created_at = models.DateTimeField(auto_now_add=True)  # Дата создания

    def __str__(self):
        return self.title

Не забудьте выполнить миграции, чтобы наша база данных знала об этой модели:

python manage.py makemigrations
python manage.py migrate

Теперь у нас есть простая, но функциональная модель для работы.

2. Определение сериализатора

Сериализаторы — это сердце DRF. Как мы помним, они преобразуют данные из объектов Python (например, моделей Django) в JSON и обратно.

Создадим файл serializers.py внутри нашего приложения blog и добавим туда сериализатор для модели Article.

# blog/serializers.py

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'content', 'created_at']  # Поля, которые будут возвращаться API

Здесь мы используем ModelSerializer, чтобы автоматически сгенерировать сериализатор на основе модели Article. Это удобно и экономит время — магия в действии!

3. Написание представления (APIView)

Теперь добавим представление для обработки запросов. Начнем с базового класса APIView, чтобы понять, как работает DRF.

Создадим файл views.py или обновим его в нашем приложении.

# blog/views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer

class ArticleListAPIView(APIView):
    def get(self, request):
        articles = Article.objects.all()  # Получаем все статьи из базы данных
        serializer = ArticleSerializer(articles, many=True)  # Сериализуем их
        return Response(serializer.data)  # Возвращаем JSON с данными

    def post(self, request):
        serializer = ArticleSerializer(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)  # Ошибка, если данные некорректны

Этот код создает API с двумя методами:

  • GET — для получения списка всех статей.
  • POST — для создания новой статьи.

4. Настройка маршрутов

Теперь свяжем наше представление с маршрутом. Добавим новый маршрут в файл urls.py нашего приложения.

# blog/urls.py

from django.urls import path
from .views import ArticleListAPIView

urlpatterns = [
    path('articles/', ArticleListAPIView.as_view(), name='article-list'),  # Регистрируем маршрут
]

И не забудьте подключить маршруты приложения в базовом urls.py проекта:

# project/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('blog.urls')),  # Подключаем маршруты приложения `blog`
]

Теперь наше API доступно по адресу http://127.0.0.1:8000/api/articles/.

5. Тестирование API

Проверим наш API. Откройте Postman, curl или просто браузер (для GET-запросов) и попробуйте обратиться к вашему API. Отправьте GET-запрос на http://127.0.0.1:8000/api/articles/. Если у вас есть данные в базе, вы получите их в формате JSON:

[
    {
        "id": 1,
        "title": "Мой первый пост",
        "content": "Это описание моего первого поста.",
        "created_at": "2023-10-10T12:34:56Z"
    },
    {
        "id": 2,
        "title": "Ещё один пост",
        "content": "Это описание другого поста.",
        "created_at": "2023-10-11T15:22:33Z"
    }
]

Если база данных пуста, вы получите пустой массив:

[]

Теперь создадим новую статью. Отправьте POST-запрос с телом:

{
    "title": "Новое приключение",
    "content": "Только что запустил свой первый API!"
}

В случае успеха вы получите ответ с созданной статьей:

{
    "id": 3,
    "title": "Новое приключение",
    "content": "Только что запустил свой первый API!",
    "created_at": "2023-10-12T10:00:00Z"
}

Если вы допустили ошибку (например, не указали обязательное поле title), сервер вернет сообщение об ошибке:

{
    "title": ["This field is required."]
}

6. Улучшение: подключение Browsable API

DRF предоставляет встроенный интерфейс для тестирования API через браузер. Откройте ваш API в браузере (http://127.0.0.1:8000/api/articles/) и наслаждайтесь пользовательским интерфейсом. Вы можете отправлять запросы прямо из браузера без дополнительных инструментов. Это невероятно удобно для отладки и исследований.

Ошибки и подсказки

На начальных этапах работы с DRF студенты часто сталкиваются с несколькими типичными проблемами. Например, если вы забыли добавить rest_framework в INSTALLED_APPS в settings.py, ваш проект не узнает о DRF, и вы получите ошибку. Также не забывайте проверять маршруты: часто ошибки с URL мешают приложению работать.

1
Задача
Модуль 3: Django, 16 уровень, 3 лекция
Недоступна
Создание сериализатора для модели
Создание сериализатора для модели
1
Задача
Модуль 3: Django, 16 уровень, 3 лекция
Недоступна
Создание APIView для работы с моделью
Создание APIView для работы с моделью
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ