🏠 Самостоятельная практика

Это не LMS-ДЗ. Официальное домашнее задание выдаётся преподавателем в LMS. Данный раздел — закрепляющее задание для самостоятельной практики материала урока 41.

⚡ Задание кратко

Добавьте три метода аутентификации к существующему DRF-проекту интернет-магазина. Настройте JWT как основной метод, расставьте permission-классы по представлениям, протестируйте через Postman.

Задание: полная настройка аутентификации в DRF-проекте

Контекст

У вас уже есть DRF-проект интернет-магазина с моделями Product, ProductDetail, Category, Supplier, Customer, Order, OrderItem, Address. Представления и сериализаторы созданы в предыдущих практикумах.

Часть 1: Настройка JWT как основного метода

  1. Установить djangorestframework-simplejwt
  2. Настроить JWTAuthentication глобально в settings.py
  3. Установить ACCESS_TOKEN_LIFETIME = 15 минут, REFRESH_TOKEN_LIFETIME = 7 дней
  4. Добавить маршруты /api/token/ и /api/token/refresh/ в urls.py

Часть 2: Расстановка permission-классов

Настройте разрешения по следующей логике:

  • Category, Product (GET): публичный доступ — IsAuthenticatedOrReadOnly
  • Supplier: только администраторы — IsAdminUser
  • Order, OrderItem, Customer: только аутентифицированные — IsAuthenticated
  • Address: только аутентифицированные — IsAuthenticated

Часть 3: Тестирование через Postman

  1. Создать суперпользователя: python manage.py createsuperuser
  2. Получить JWT: POST /api/token/ с username и password
  3. Проверить публичный эндпоинт: GET /categories/ без токена — должен вернуть 200
  4. Проверить защищённый: GET /orders/ без токена — должен вернуть 401
  5. Проверить защищённый с токеном: GET /orders/ с заголовком Authorization: Bearer ... — должен вернуть 200
  6. Проверить IsAdminUser: GET /suppliers/ обычным пользователем — должен вернуть 403

Подготовка окружения

# 1. Создать виртуальное окружение (если нет)
python -m venv venv
venv\Scripts\activate  # Windows

# 2. Установить зависимости
pip install django djangorestframework djangorestframework-simplejwt

# 3. Создать requirements.txt
pip freeze > requirements.txt

# 4. Применить миграции
python manage.py migrate

# 5. Создать суперпользователя
python manage.py createsuperuser

# 6. Запустить сервер
python manage.py runserver

Пошаговое решение

Шаг 1: settings.py

from datetime import timedelta

INSTALLED_APPS = [
    # ... стандартные приложения Django
    'rest_framework',
    'rest_framework_simplejwt',
    'store',
]

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

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
}

Шаг 2: urls.py

from django.urls import path, include
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'),
    path('', include('store.urls')),
]

Шаг 3: store/views.py — выборочно

from rest_framework.permissions import (
    IsAuthenticated, IsAuthenticatedOrReadOnly, IsAdminUser, AllowAny
)
from rest_framework_simplejwt.authentication import JWTAuthentication

class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

class SupplierViewSet(viewsets.ModelViewSet):
    queryset = Supplier.objects.all()
    serializer_class = SupplierSerializer
    permission_classes = [IsAdminUser]

class OrderListCreateView(ListCreateAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return OrderSerializer
        return OrderCreateUpdateSerializer

Проверка в VS Code

Встроенный терминал

  1. Открыть проект в VS Code: code .
  2. Терминал → Новый терминал
  3. Активировать venv: venv\Scripts\activate
  4. Запустить сервер: python manage.py runserver

Тестирование через REST Client (расширение VS Code)

Создать файл test.http в корне проекта:

### Получить JWT
POST http://127.0.0.1:8000/api/token/
Content-Type: application/json

{
  "username": "admin",
  "password": "your_password"
}

### Публичный эндпоинт (без токена)
GET http://127.0.0.1:8000/categories/

### Защищённый эндпоинт (с JWT)
GET http://127.0.0.1:8000/orders/
Authorization: Bearer ВСТАВИТЬ_ACCESS_TOKEN

Точки останова (debug)

Создать .vscode/launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Django",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/manage.py",
      "args": ["runserver", "--noreload"],
      "django": true
    }
  ]
}

Нажать F5, поставить точку останова на строке authentication_classes в представлении, выполнить запрос через Postman — выполнение остановится в отладчике.

Связь с теорией и примерами

← К оглавлению урока