JavaRush /Курсы /Модуль 3: Django /Обработка запросов GET, POST, PUT, DELETE

Обработка запросов GET, POST, PUT, DELETE

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

Давайте разберёмся мы с обработкой запросов GET, POST, PUT и DELETE. Эти методы являются основными строительными блоками REST API, и понимание их работы — фундамент в разработке серверных приложений.

Если представить ваш API как ресторан, то HTTP-методы — это действия, которые вы можете совершать: GET (посмотреть меню), POST (сделать заказ), PUT (отредактировать заказ), DELETE (отменить заказ). Без понимания HTTP-методов ваш API превратится в хаотичную забегаловку, где клиенты будут теряться в догадках, что же делать.

REST API в повседневной разработке используют эти методы для выполнения CRUD (Create, Read, Update, Delete)-операций. Сегодня мы научимся поддерживать все эти методы в представлениях (views) и протестируем их.

Понятие HTTP-методов

Основные HTTP-методы:

  • GET — извлечение данных (без изменений).
  • POST — создание новых данных.
  • PUT — обновление данных (замещение записи целиком).
  • PATCH — частичное обновление данных (в этой лекции упомянем вскользь).
  • DELETE — удаление данных.

Эти методы определяют, как клиент общается с сервером.

Как создать представления для обработки HTTP-методов?

Мы будем работать с APIView, чтобы поддерживать запросы различных методов. Напомним, что APIView предоставляет базовый интерфейс для обработки запросов HTTP-методов, таких как GET, POST, PUT, DELETE.

Практический пример: работа с моделью Article

Сначала создадим модель Article, если её ещё нет.

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    published_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

Не забудьте выполнить миграции.

python manage.py makemigrations
python manage.py migrate

Теперь создадим сериализатор для работы с этой моделью.

# serializers.py
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

Реализация с использованием APIView

Теперь создадим представление с обработкой запросов GET, POST, PUT, DELETE.

# 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 ArticleAPIView(APIView):
    def get(self, request, pk=None):
        # Если передан pk, возвращаем конкретную запись
        if pk:
            try:
                article = Article.objects.get(pk=pk)
                serializer = ArticleSerializer(article)
                return Response(serializer.data)
            except Article.DoesNotExist:
                return Response(
                    {"error": "Article not found"},
                    status=status.HTTP_404_NOT_FOUND
                )

        # Если pk не передан, возвращаем список записей
        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)

    def put(self, request, pk):
        try:
            article = Article.objects.get(pk=pk)
        except Article.DoesNotExist:
            return Response(
                {"error": "Article not found"},
                status=status.HTTP_404_NOT_FOUND
            )

        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):
        try:
            article = Article.objects.get(pk=pk)
        except Article.DoesNotExist:
            return Response(
                {"error": "Article not found"},
                status=status.HTTP_404_NOT_FOUND
            )

        article.delete()
        return Response(
            {"message": "Article deleted"},
            status=status.HTTP_204_NO_CONTENT
        )

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

Для работы нашего API добавим маршруты в urls.py.

# urls.py
from django.urls import path
from .views import ArticleAPIView

urlpatterns = [
    path('articles/', ArticleAPIView.as_view()),
    path('articles/<int:pk>/', ArticleAPIView.as_view()),
]

Тестирование эндпоинтов

Теперь самое интересное — тестирование! Вы можете использовать Postman, curl, или даже встроенный браузер API Django.

  1. GET-запросы:
  • Чтобы получить список всех статей:

    GET /articles/
    
  • Чтобы получить конкретную статью:

    GET /articles/1/
    
  1. POST-запрос: Создание новой статьи.
  • Тело запроса:

    {
      "title": "My First Article",
      "content": "This is the content of my first article."
    }
    
  • Запрос:

    POST /articles/
    
  1. PUT-запрос: Обновление существующей статьи.
  • Тело запроса:

    {
      "title": "Updated Title",
      "content": "Updated content."
    }
    
  • Запрос:
    PUT /articles/1/
    
  1. DELETE-запрос: Удаление статьи.
  • Запрос:
    DELETE /articles/1/
    

Типичные ошибки

  1. Отсутствие проверки на существование объекта. Если забыть проверку на существование записи перед обновлением или удалением, сервер вернёт 500 Internal Server Error. Это неинформативно для клиента, лучше возвращать 404 как в примерах выше.

  2. PUT без полного замещения данных. Метод PUT ожидает, что вы отправите все поля объекта. Если отправить неполные данные, это приведёт к ошибке валидации. Если вы хотите заменить только часть данных, используйте метод PATCH.

  3. Отсутствие обработки ошибок сериализации. Не забывайте проверять serializer.is_valid() и возвращать ошибки в ответе, иначе клиент не поймёт, что пошло не так.

Применение на практике

На собеседовании вас могут спросить: "Как создать эндпоинт для CRUD-операций в DRF?" Исходный код из этой лекции легко адаптируется для большинства подобных задач. Также вы можете использовать эти примеры в реальных проектах для быстрых и безопасных API.

Надеемся, что вы уже чувствуете себя с запросами GET, POST, PUT и DELETE уверено. Ну, или хотя бы точно знаете, как составить "ресторанное меню" вашего API!

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