Как создать REST API на Django REST Framework?python-48

Django REST Framework — мощный и гибкий инструмент для создания Web API в Django. Вот пошаговое руководство по созданию REST API.

1. Установка и настройка

Установите необходимые пакеты:

pip install django djangorestframework

Добавьте в settings.py:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'your_app',
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ]
}

2. Создание модели

# models.py
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

3. Сериализатор

Сериализаторы преобразуют данные модели в JSON и обратно:

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

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'description', 'price', 'created_at', 'updated_at']
        read_only_fields = ['created_at', 'updated_at']

4. Представления

Вариант 1: ViewSets

# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated]  # или [AllowAny] для публичного доступа

Вариант 2: APIView

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class ProductList(APIView):
    def get(self, request):
        products = Product.objects.all()
        serializer = ProductSerializer(products, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = ProductSerializer(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)

5. Маршрутизация

Для ViewSets:

# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet

router = DefaultRouter()
router.register(r'products', ProductViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls')),
]

Для APIView:

from .views import ProductList, ProductDetail

urlpatterns = [
    path('products/', ProductList.as_view()),
    path('products/<int:pk>/', ProductDetail.as_view()),
]

6. Аутентификация

Токенная аутентификация:

pip install django-rest-framework-simplejwt
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ]
}

# urls.py
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns += [
    path('api/token/', TokenObtainPairView.as_view()),
    path('api/token/refresh/', TokenRefreshView.as_view()),
]

7. Фильтрация и пагинация

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

# views.py
from django_filters.rest_framework import DjangoFilterBackend

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['price']

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

Используйте DRF's test client или pytest:

from rest_framework.test import APITestCase

class ProductAPITestCase(APITestCase):
    def setUp(self):
        self.product = Product.objects.create(name="Test", price=100)

    def test_get_products(self):
        response = self.client.get('/products/')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 1)

9. Документирование API

Используйте Swagger или ReDoc:

pip install drf-yasg
# urls.py
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view(
    openapi.Info(
        title="Product API",
        default_version='v1',
    ),
    public=True,
)

urlpatterns += [
    path('swagger/', schema_view.with_ui('swagger')),
    path('redoc/', schema_view.with_ui('redoc')),
]

Резюмируем

  1. DRF предоставляет мощные инструменты для создания REST API
  2. Основные компоненты: Models → Serializers → Views → URLs
  3. ViewSets упрощают создание CRUD операций
  4. DRF поддерживает различные методы аутентификации
  5. Встроенные решения для пагинации, фильтрации и документации
  6. Легко расширяется и интегрируется с Django

Для начала работы достаточно реализовать Model, Serializer и ViewSet. DRF автоматически обработает большинство стандартных операций с API, позволяя сосредоточиться на бизнес-логике.