Сегодня мы создадим свой первый 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 мешают приложению работать.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ