🏠 Самостоятельная практика
Это не LMS-ДЗ. Официальное домашнее задание выдаётся преподавателем в LMS. Данный раздел — закрепляющее задание для самостоятельной практики материала урока 41.
⚡ Задание кратко
Добавьте три метода аутентификации к существующему DRF-проекту интернет-магазина. Настройте JWT как основной метод, расставьте permission-классы по представлениям, протестируйте через Postman.
Задание: полная настройка аутентификации в DRF-проекте
Контекст
У вас уже есть DRF-проект интернет-магазина с моделями Product, ProductDetail, Category, Supplier, Customer, Order, OrderItem, Address. Представления и сериализаторы созданы в предыдущих практикумах.
Часть 1: Настройка JWT как основного метода
- Установить
djangorestframework-simplejwt - Настроить
JWTAuthenticationглобально вsettings.py - Установить
ACCESS_TOKEN_LIFETIME= 15 минут,REFRESH_TOKEN_LIFETIME= 7 дней - Добавить маршруты
/api/token/и/api/token/refresh/вurls.py
Часть 2: Расстановка permission-классов
Настройте разрешения по следующей логике:
- Category, Product (GET): публичный доступ —
IsAuthenticatedOrReadOnly - Supplier: только администраторы —
IsAdminUser - Order, OrderItem, Customer: только аутентифицированные —
IsAuthenticated - Address: только аутентифицированные —
IsAuthenticated
Часть 3: Тестирование через Postman
- Создать суперпользователя:
python manage.py createsuperuser - Получить JWT: POST
/api/token/сusernameиpassword - Проверить публичный эндпоинт: GET
/categories/без токена — должен вернуть 200 - Проверить защищённый: GET
/orders/без токена — должен вернуть 401 - Проверить защищённый с токеном: GET
/orders/с заголовкомAuthorization: Bearer ...— должен вернуть 200 - Проверить 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
Встроенный терминал
- Открыть проект в VS Code:
code . - Терминал → Новый терминал
- Активировать venv:
venv\Scripts\activate - Запустить сервер:
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 — выполнение остановится в отладчике.