🏠 Итоговая самопроверка — Финал курса
⚡ Итоговые задания из лекции
- ДЗ из лекции 1: JWT-аутентификация — SimpleJWT, /api/token/, /api/token/refresh/, permissions.
- ДЗ из лекции 2: request.user + object-level permissions + Swagger (drf-yasg).
- ДЗ из лекции 3: Регистрация, логин с JWT в куки, logout с blacklist.
- ДЗ из лекции 4: Сигналы — статус задачи → email-уведомление владельцу.
- Финальный тест по модулю Auth + анкета обратной связи.
Задания из лекции (для самостоятельной практики)
Задание 1: JWT-аутентификация
Цель: Настроить JWT-аутентификацию с SimpleJWT и реализовать permissions для защиты API.
- Установить
djangorestframework-simplejwt. - Добавить JWTAuthentication в DEFAULT_AUTHENTICATION_CLASSES.
- Настроить SIMPLE_JWT: ACCESS_TOKEN_LIFETIME, REFRESH_TOKEN_LIFETIME.
- Добавить маршруты
/api/token/и/api/token/refresh/. - Применить IsAuthenticated ко всем представлениям задач.
- Настроить глобальную пагинацию (PageNumberPagination, 5 элементов на страницу).
Проверка: В Postman — POST /api/token/ → получить access и refresh → GET /tasks/ с Bearer токеном → 200 OK.
Задание 2: request.user + Permissions + Swagger
Цель: Реализовать авторизацию с извлечением текущего пользователя и интегрировать Swagger.
- Обновить модели Task и SubTask: добавить поле
owner = ForeignKey(User). - Обновить сериализаторы: owner → read_only=True.
- Переопределить perform_create() →
serializer.save(owner=self.request.user). - Создать view UserTaskListView: возвращает только задачи текущего пользователя.
- Создать IsOwnerOrReadOnly permission → применить к Task/SubTask views.
- Установить drf-yasg, настроить /swagger/ и /redoc/.
Проверка: Postman — токен пользователя A → PUT /tasks/1/ (принадлежит B) → 403 Forbidden.
Задание 3: Регистрация, логин, logout с JWT
Цель: Полный цикл аутентификации через JWT в httpOnly-куки.
- RegisterView: валидация полей (уникальность email/username, сложность пароля), хэширование, JWT в куки при ответе.
- LoginView: authenticate() → RefreshToken.for_user() → set_cookie(httponly=True).
- JWTAuthenticationMiddleware: автоматически извлекает access из куки, добавляет в заголовок Authorization.
- LogoutView: delete_cookie() + помещение refresh в blacklist.
Проверка: POST /api/register/ → куки установлены → GET /api/books/ без заголовка → 200 (middleware подставил токен) → POST /api/logout/ → GET /api/books/ → 401.
Задание 4: Сигналы + Email
Цель: Реализовать автоматические email-уведомления при изменении статуса задачи.
- Создать сигнал на post_save для модели Task.
- При изменении статуса (или закрытии) — отправить email на адрес владельца задачи.
- Добавить проверку: не отправлять повторно, если статус не изменился (сравнить с предыдущим значением через pre_save).
- Настроить EMAIL_BACKEND = console.EmailBackend для тестирования.
- Зарегистрировать сигналы в AppConfig.ready().
Проверка: Изменить статус задачи через shell или Postman → в консоли Django-сервера появляется письмо с шаблоном уведомления.
Подготовка окружения
# 1. Создать и активировать виртуальное окружение
python -m venv venv
venv\Scripts\activate # Windows
# 2. Установить зависимости
pip install django djangorestframework
pip install djangorestframework-simplejwt
pip install drf-yasg
# 3. Создать requirements.txt
pip freeze > requirements.txt
# 4. Применить миграции
python manage.py makemigrations
python manage.py migrate
# 5. Создать суперпользователя для тестирования
python manage.py createsuperuser
# 6. Запустить сервер разработки
python manage.py runserver
Проверка в VS Code и Postman
VS Code — запуск и отладка
- Открыть папку проекта в VS Code.
- Выбрать интерпретатор Python из venv (Ctrl+Shift+P → "Python: Select Interpreter").
- В терминале:
python manage.py runserver. - Для отладки — создать
.vscode/launch.json:{ "version": "0.2.0", "configurations": [{ "name": "Django", "type": "debugpy", "request": "launch", "program": "${workspaceFolder}/manage.py", "args": ["runserver"], "django": true }] } - F5 — запустить сервер с отладчиком. Точки останова в signals.py/views.py.
Postman — тестирование JWT
- POST
http://127.0.0.1:8000/api/token/→ Body (form-data): username, password → Скопировать "access" из ответа. - GET
http://127.0.0.1:8000/api/tasks/→ Headers: Authorization: Bearer <access> → 200 OK. - POST
http://127.0.0.1:8000/api/token/refresh/→ Body: {"refresh": "<refresh_token>"} → Получить новый access. - Swagger UI: открыть
http://127.0.0.1:8000/swagger/→ Authorize → Bearer <access> → тестировать эндпоинты.
Связь с теорией и примерами курса
- JWT и SimpleJWT → Урок 44: theory.html, Урок 46: theory.html#jwt
- Разрешения и BasePermission → Урок 42: theory.html, Урок 46: examples.html
- Сигналы и Email → Урок 45: theory.html, Урок 46: examples.html
- Swagger → Урок 43: theory.html, Урок 46: examples.html
Поздравляем с завершением курса!
Вы прошли все 46 уроков Python Advanced — от основ Flask до полноценного Auth-API на Django REST Framework.
Что вы освоили:
- Flask: маршрутизация, шаблоны Jinja2, Pydantic, blueprints
- SQLAlchemy: модели, запросы, миграции Alembic
- Django: MVT, ORM, Admin, формы, middleware
- DRF: сериализаторы, ViewSets, Generic Views, роутеры
- DRF: фильтрация, пагинация, транзакции, логирование
- Auth: JWT, разрешения, сигналы, email