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, і попереду нас чекають ще більш цікаві завдання.

3
Опитування
Налаштування маршрутизації для API, рівень 16, лекція 9
Недоступний
Налаштування маршрутизації для API
Налаштування маршрутизації для API
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ