Сьогодні ми створимо свій перший API за допомогою DRF. І ось як ми будемо це робити:
- Створимо модель даних.
- Визначимо серіалізатор для перетворення даних.
- Напишемо представлення для обробки запитів.
- Налаштуємо маршрути.
- І нарешті, протестуємо 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 заважають додатку працювати.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ