Django REST Framework — мощный и гибкий инструмент для создания Web API в Django. Вот пошаговое руководство по созданию REST API.
Установите необходимые пакеты:
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',
]
}
# 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
Сериализаторы преобразуют данные модели в 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']
# 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] для публичного доступа
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)
# 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')),
]
from .views import ProductList, ProductDetail
urlpatterns = [
path('products/', ProductList.as_view()),
path('products/<int:pk>/', ProductDetail.as_view()),
]
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()),
]
# 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']
Используйте 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)
Используйте 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')),
]
Для начала работы достаточно реализовать Model, Serializer и ViewSet. DRF автоматически обработает большинство стандартных операций с API, позволяя сосредоточиться на бизнес-логике.