Из чего состоит Django REST Framework (DRF)
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Архитектура 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: от сериализации данных до управления доступом и кэширования. Его модульная архитектура позволяет легко расширять и кастомизировать поведение для конкретных требований.