← Назад к вопросам

Из чего состоит Django REST Framework (DRF)

1.0 Junior🔥 161 комментариев
#Git и VCS#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Архитектура Django REST Framework

Django REST Framework (DRF) — это мощный инструмент для создания REST API, построенный на основе Django. Его архитектура состоит из нескольких ключевых компонентов, которые работают вместе для обработки HTTP-запросов.

1. Serializers (Сериализаторы)

Сериализаторы преобразуют данные между Python-объектами и JSON:

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source="author.username", read_only=True)
    
    class Meta:
        model = Post
        fields = ["id", "title", "content", "author_name", "created_at"]
        read_only_fields = ["id", "created_at"]
    
    def validate_title(self, value):
        if len(value) < 5:
            raise serializers.ValidationError("Title must be at least 5 characters")
        return value

Типы:

  • ModelSerializer — для моделей Django
  • Serializer — для произвольных данных
  • ListSerializer — для коллекций

2. Views (Представления) и ViewSets

Обрабатывают HTTP-запросы и возвращают ответы:

from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [IsAuthenticated]
    filterset_fields = ["author", "created_at"]
    ordering_fields = ["created_at", "title"]
    
    @action(detail=True, methods=["post"])
    def publish(self, request, pk=None):
        post = self.get_object()
        post.is_published = True
        post.save()
        return Response({"status": "published"})

Основные классы:

  • APIView — базовый класс
  • GenericAPIView — с миксинами для CRUD
  • ViewSet — автоматическая генерация URL
  • ModelViewSet — полный CRUD из коробки

3. Routers (Маршрутизаторы)

Автоматически генерируют URL-паттерны для ViewSet:

from rest_framework.routers import DefaultRouter
from django.urls import path, include

router = DefaultRouter()
router.register(r"posts", PostViewSet)
router.register(r"comments", CommentViewSet)

urlpatterns = [
    path("api/", include(router.urls)),
]

# Генерирует:
# GET    /api/posts/
# POST   /api/posts/
# GET    /api/posts/{id}/
# PUT    /api/posts/{id}/
# PATCH  /api/posts/{id}/
# DELETE /api/posts/{id}/
# POST   /api/posts/{id}/publish/  (кастомный action)

4. Permissions (Разрешения)

Контролируют доступ к ресурсам:

from rest_framework.permissions import BasePermission, IsAuthenticated, IsAdminUser

class IsOwnerOrReadOnly(BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in ["GET", "HEAD", "OPTIONS"]:
            return True
        return obj.author == request.user

class PostViewSet(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated, IsOwnerOrReadOnly]

Встроенные:

  • AllowAny
  • IsAuthenticated
  • IsAdminUser
  • IsAuthenticatedOrReadOnly

5. Authentication (Аутентификация)

Идентифицирует пользователя по запросу:

from rest_framework.authentication import TokenAuthentication, SessionAuthentication

class PostViewSet(viewsets.ModelViewSet):
    authentication_classes = [TokenAuthentication, SessionAuthentication]
    permission_classes = [IsAuthenticated]

Типы:

  • BasicAuthentication
  • TokenAuthentication
  • SessionAuthentication
  • JWTAuthentication (требует пакета)

6. Throttling (Ограничение частоты)

Защита от DDoS и злоупотребления:

from rest_framework.throttling import UserRateThrottle

class CustomThrottle(UserRateThrottle):
    scope = "custom"
    rate = "100/hour"

class PostViewSet(viewsets.ModelViewSet):
    throttle_classes = [CustomThrottle]

7. Filtering и Pagination (Фильтрация и пагинация)

Оптимизируют обработку большого количества данных:

from rest_framework.pagination import PageNumberPagination
from django_filters import FilterSet, CharFilter

class PostFilter(FilterSet):
    title = CharFilter(lookup_expr="icontains")

class PostViewSet(viewsets.ModelViewSet):
    filterset_class = PostFilter
    pagination_class = PageNumberPagination
    search_fields = ["title", "content"]
    ordering_fields = ["created_at", "title"]

8. Middleware и Exception Handling

Обработка ошибок и кросс-заточные интеграции:

from rest_framework.exceptions import APIException

class CustomException(APIException):
    status_code = 400
    default_detail = "Custom error occurred"

REST_FRAMEWORK = {
    "EXCEPTION_HANDLER": "myapp.exceptions.custom_exception_handler",
}

9. Renderers и Parsers (Отрисовщики и парсеры)

Конвертируют данные между форматами (JSON, XML, HTML):

REST_FRAMEWORK = {
    "DEFAULT_RENDERER_CLASSES": [
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ],
    "DEFAULT_PARSER_CLASSES": [
        "rest_framework.parsers.JSONParser",
    ],
}

Полный пример: API с DRF

# models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

# serializers.py
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ["id", "title", "content", "author", "created_at"]

# views.py
class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [IsAuthenticated]

# urls.py
router = DefaultRouter()
router.register(r"posts", PostViewSet)
urlpatterns = [path("api/", include(router.urls))]

Заключение

DRF — это полноценный фреймворк в фреймворке, предоставляющий все необходимое для построения REST API: от сериализации данных до управления доступом и кэширования. Его модульная архитектура позволяет легко расширять и кастомизировать поведение для конкретных требований.