В современном мире разработка API является ключевым навыком для любого веб-разработчика. Django, мощный Python веб-фреймворк, в сочетании с Django REST Framework (DRF), предоставляет отличные инструменты для быстрого создания и развертывания масштабируемых RESTful API. Эта статья предоставит вам пошаговое руководство по созданию такого API, охватывая все, от установки до развертывания на production-сервере.
Начало работы с Django REST Framework
Django REST Framework (DRF) – это мощный и гибкий инструмент для создания веб-API. Он предоставляет широкий набор функций, упрощающих разработку, аутентификацию, сериализацию и тестирование API. Прежде чем мы начнем, убедитесь, что у вас установлены Python и pip.
Установка Django и Django REST Framework: пошаговая инструкция
-
Создайте виртуальное окружение (рекомендуется):
python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows -
Установите Django и Django REST Framework с помощью pip:
pip install django djangorestframework
Настройка базового проекта Django для API
-
Создайте новый проект Django:
django-admin startproject myapi cd myapi -
Создайте новое Django приложение:
python manage.py startapp myapp -
Добавьте
'rest_framework'и'myapp'вINSTALLED_APPSв файлеmyapi/settings.py:INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'myapp', ]
Создание первой модели и сериализатора
Определение Django моделей для данных API
Создайте модель Django, которая будет представлять данные, которые будет предоставлять ваш API. Например, создадим модель Product в файле myapp/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)
def __str__(self):
return self.name
Затем выполните миграции:
python manage.py makemigrations
python manage.py migrate
Разработка сериализаторов для преобразования данных в JSON
Сериализаторы преобразуют модели Django в JSON (и обратно). Создайте файл myapp/serializers.py и добавьте сериализатор для модели Product:
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
Реализация API Views с использованием Django REST Framework
Создание ViewSets для CRUD операций
ViewSet’ы предоставляют логику для CRUD (Create, Read, Update, Delete) операций. В файле myapp/views.py создайте ProductViewSet:
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
Затем настройте URL-адреса в файле myapp/urls.py:
from django.urls import path, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Не забудьте добавить URL-адреса myapp в основной файл myapi/urls.py:
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')),
]
Использование Generic Views и Mixins для сокращения кода
DRF предоставляет Generic Views и Mixins, которые упрощают написание API views. Например, ListCreateAPIView и RetrieveUpdateDestroyAPIView могут быть использованы для обработки списков и отдельных объектов соответственно. Использование этих инструментов поможет вам сократить объем кода и повысить его читаемость.
Аутентификация, права доступа и безопасность API
Настройка аутентификации на основе токенов
Аутентификация на основе токенов – популярный способ защиты API. Установите rest_framework.authtoken:
pip install rest_framework_simplejwt
Добавьте 'rest_framework_simplejwt' в INSTALLED_APPS и настройте аутентификацию в settings.py:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
Добавьте URL для получения токена в myapi/urls.py:
from django.urls import path
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
Реализация системы прав доступа для различных типов пользователей
Вы можете создать собственные классы прав доступа, чтобы контролировать, кто имеет доступ к определенным endpoints. Например, можно создать класс, который разрешает доступ только администраторам:
from rest_framework import permissions
class IsAdminUserOrReadOnly(permissions.BasePermission):
def has_permission(self, request, view):
if request.method in permissions.SAFE_METHODS:
return True
return request.user.is_staff
Примените этот класс прав доступа к вашему ViewSet:
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
permission_classes = [IsAdminUserOrReadOnly]
Тестирование и развертывание API
Написание тестов для API endpoints
Тестирование API – важный этап разработки. Django предоставляет инструменты для написания тестов. Создайте файл myapp/tests.py и напишите тесты для ваших endpoints:
from django.test import TestCase
from rest_framework.test import APIClient
from .models import Product
class ProductAPITestCase(TestCase):
def setUp(self):
self.client = APIClient()
self.product = Product.objects.create(name='Test Product', description='Test Description', price=10.00)
def test_get_product(self):
response = self.client.get(f'/api/products/{self.product.id}/')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['name'], 'Test Product')
Запустите тесты:
python manage.py test myapp
Развертывание API на production-сервере (Gunicorn, Nginx)
Для развертывания API на production-сервере вам потребуется WSGI-сервер (например, Gunicorn) и веб-сервер (например, Nginx). Установите Gunicorn:
pip install gunicorn
Запустите Gunicorn:
gunicorn myapi.wsgi
Настройте Nginx для перенаправления запросов на Gunicorn. Пример конфигурации Nginx:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
root /path/to/your/static/files;
}
}
Заключение
В этой статье мы рассмотрели основные этапы создания и развертывания масштабируемого API с использованием Django и Django REST Framework. Мы начали с установки и настройки, затем создали модель и сериализатор, реализовали API views, настроили аутентификацию и права доступа, а также написали тесты и развернули API на production-сервере. Следуя этим шагам, вы сможете быстро и эффективно создавать мощные и безопасные API на Django.