JavaRush /Курсы /Модуль 3: Django /Практическое занятие по созданию простого API

Практическое занятие по созданию простого API

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

Теперь, когда вы достаточно подготовлены, пришло время закатать рукава и создать свой первый полноценный API. Это будет отличный шанс применить все знания, которые вы приобрели на предыдущих лекциях. Цели у нас такие:

  1. Научиться последовательно создавать API для модели данных.
  2. Выстроить процесс работы: от определения модели до тестирования API.
  3. Применить знания о Serializer, APIView и маршрутизации.
  4. Освоить тестирование вашего API с помощью инструментов, таких как Postman или curl.

Постановка задачи

Мы создадим API для управления моделью "Статья" (Article). Функциональность API будет включать:

  • Получение списка всех статей GET.
  • Получение деталей одной статьи GET с параметром ID.
  • Создание новой статьи POST.
  • Обновление существующей статьи PUT.
  • Удаление статьи DELETE.

Определение модели "Статья"

Первым делом добавим модель в приложение blog. Если у вас ещё нет приложения blog, создайте его:

python manage.py startapp blog

Теперь добавим модель Article в файл models.py приложения blog:

from django.db import models

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

    def __str__(self):
        return self.title

Далее, сделаем миграции для базы данных:

python manage.py makemigrations
python manage.py migrate

Создание сериализатора для модели

Сериализаторы в DRF помогают преобразовывать данные между форматом JSON и объектами Django-моделей. Для начала создадим файл serializers.py в приложении blog, если его еще нет.

Добавим код:

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'  # Включаем все поля модели

3. Создание представлений для API

Теперь мы создадим API для работы с моделью Article. Мы будем использовать APIView для большей гибкости. Откройте файл views.py в приложении blog и добавьте следующий код:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404

from .models import Article
from .serializers import ArticleSerializer


class ArticleListCreateAPIView(APIView):
    """
    API для получения списка статей и создания новых статей.
    """
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    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)


class ArticleDetailAPIView(APIView):
    """
    API для получения, обновления и удаления конкретной статьи.
    """
    def get(self, request, pk):
        article = get_object_or_404(Article, pk=pk)
        serializer = ArticleSerializer(article)
        return Response(serializer.data)

    def put(self, request, pk):
        article = get_object_or_404(Article, pk=pk)
        serializer = ArticleSerializer(article, 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):
        article = get_object_or_404(Article, pk=pk)
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

Настройка маршрутизации

Теперь подключим наши представления к маршрутам. Откройте файл urls.py в приложении blog (если файла нет, создайте его) и добавьте следующий код:

from django.urls import path
from .views import ArticleListCreateAPIView, ArticleDetailAPIView

urlpatterns = [
    path('articles/', ArticleListCreateAPIView.as_view(), name='article-list-create'),
    path('articles/<int:pk>/', ArticleDetailAPIView.as_view(), name='article-detail'),
]

Не забудьте подключить маршруты приложения blog к общим маршрутам проекта. Откройте urls.py в основном проекте и добавьте:

from django.urls import path, include

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

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

Теперь запустим сервер разработки и протестируем API. Запустите сервер:

python manage.py runserver

Тестирование через браузер

Откройте в браузере следующие URL:

  • GET список статей: http://127.0.0.1:8000/api/articles/
  • POST новая статья: http://127.0.0.1:8000/api/articles/
  • GET детали статьи: http://127.0.0.1:8000/api/articles/<id>/
  • PUT обновление статьи: http://127.0.0.1:8000/api/articles/<id>/
  • DELETE удаление статьи: http://127.0.0.1:8000/api/articles/<id>/

Тестирование через Postman

  1. Для GET запросов укажите URL и нажмите "Send".
  2. Для POST запросов отправьте JSON, например:
    {
        "title": "Первая статья",
        "content": "Содержание первой статьи"
    }
    
  3. Аналогично, для PUT запросов укажите обновляемые данные.
  4. Для DELETE запросов просто отправьте запрос без тела.

Возможные ошибки и их решение

  • Ошибка 404 при получении объекта: убедитесь, что вы используете правильный ID статьи.
  • Ошибка 400 при создании статьи: проверьте валидность JSON-данных. Поля title и content являются обязательными.
  • Ошибка 500: проверьте логи сервера для выявления проблемы. Возможно, вы забыли сделать миграции.

Идеи для улучшения

  • Добавьте валидацию полей в сериализаторе, например, минимальную длину для title.
  • Реализуйте отображение статей с пагинацией.
  • Расширьте API, добавив поиск или фильтрацию по названию статей.

Теперь у вас есть базовое, но полностью рабочее API для работы с моделью "Статья". Мы только начали погружение в мощные возможности Django REST Framework, и впереди нас ждут ещё более интересные задачи.

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