Практический курс по Django 5.2 LTS и Django 6.0: модели и ORM, HTTP-слой, безопасность, DRF, тестирование, фоновые задачи, деплой и архитектурные компромиссы. Устаревшие подходы вынесены в явно помеченные legacy-примечания.
Версия курса: 3.0. Редакция от 19 июля 2026 года для Python 3.12+, Django 5.2 LTS и Django 6.0.
Курс учит не только синтаксису фреймворка, но и тому, как принимать инженерные решения: где нужна транзакция, почему возникает N+1, как не открыть доступ к чужим данным и что проверить перед деплоем.
Внутри — 32 последовательные темы, 320 вопросов с вариантами ответа и 7 открытых экзаменационных вопросов. Оценка времени намеренно не фиксируется: она сильно зависит от опыта студента и от того, выполняет ли он примеры самостоятельно.
Целевая среда курса: Python 3.12+, Django 5.2 LTS и Django 6.0. Основные примеры совместимы с обеими ветками, а возможности Django 6.0 отмечены отдельно.
В реальной работе Django-проект не всегда использует последнюю версию. Поэтому устаревшие подходы не исчезают из курса бесследно, а получают явную маркировку.
Для нового проекта выбирайте последнюю patch-версию поддерживаемой ветки. На июль 2026 года Django 5.2 остаётся LTS-веткой, а Django 6.0 — текущей feature-веткой. Django 4.2 уже не получает исправления безопасности.
| Уровень | Результат |
|---|---|
| Junior | Понимание жизненного цикла запроса, моделей, форм, шаблонов, auth и тестов |
| Middle | Уверенная работа с ORM, транзакциями, DRF, кэшем и production-настройками |
| Senior | Анализ компромиссов архитектуры, изоляции данных, фоновых задач и масштабирования |
Курс предполагает базовое знание Python, SQL, Git и командной строки. Docker можно изучать по ходу программы.
transaction.on_commit() и границы их применения.| Область | Инструменты |
|---|---|
| Core | Python 3.12+, Django 5.2 LTS / 6.0, PostgreSQL 15+ |
| API | Django REST Framework, Strawberry GraphQL |
| Кэш и очереди | Redis или Memcached, Celery, RabbitMQ/Redis |
| Тесты | Django TestCase, pytest-django, Playwright |
| Деплой | Docker Compose, Gunicorn или ASGI-сервер, reverse proxy/CDN |
| Наблюдаемость | Python logging, Sentry, Prometheus, Grafana, OpenTelemetry |
Graphene рассматривается как legacy-вариант, который ещё встречается в существующих проектах. Основной GraphQL-пример курса использует Strawberry.
Каждая тема строится одинаково:
Листинг в учебнике не считается готовым production-решением, пока не объяснены его границы. Особенно это относится к платежам, multi-tenancy, фоновой обработке, кэшу и авторизации.
После курса студент сможет собрать и проверить Django-приложение, объяснить выбранные решения, найти типичные проблемы ORM и безопасности, написать тесты и подготовить сервис к эксплуатации. Итоговая SaaS-глава связывает эти навыки в один проект, но не скрывает производственные компромиссы за демонстрационным кодом.
MTV, структура проекта, безопасные settings, WSGI и ASGI
Поля, ограничения БД, миграции и жизненный цикл модели
QuerySet, filter, exclude, order_by, values, annotate, aggregate
F/Q, subquery, custom QuerySet, транзакции и безопасный raw SQL
N+1, EXPLAIN, индексы, bulk-операции и потоковая обработка
Function-based vs Class-based views, mixins, decorators
ListView, DetailView, CreateView, UpdateView, DeleteView, FormView
path, re_path, include, namespace, reverse, get_object_or_404
DTL, наследование, custom tags и template partials Django 6.0
Form, ModelForm, валидация, файлы, formsets и виджеты
User модель, login/logout, password hashing, custom user model
Permissions, Groups, decorators, mixins, object-level permissions
ModelAdmin, inline, actions, custom pages, admin sites
Создание middleware, порядок выполнения, request/response hooks
Signals, transaction.on_commit и границы скрытых side effects
TestCase, Client, RequestFactory, pytest-django, fixtures, factories
Integration тесты, Selenium, Playwright, coverage, CI integration
Serializer, ModelSerializer, nested serializers, validation
APIView, GenericAPIView, ViewSet, Router, pagination, filtering
Session/Token/JWT, OAuth2/OIDC, permissions и throttling
Cache backends, per-view cache, template fragments, low-level API, invalidation
CSRF, XSS, SQLi, uploads, CSP, security headers и секреты
ASGI, async views/ORM, WebSockets и ограничения async-кода
Celery, commit-aware enqueue, retries, идемпотентность и Django Tasks
Dockerfile, docker-compose, Gunicorn, Nginx, CI/CD, production settings
Logging config, Sentry, Prometheus, Grafana, health checks, alerts
Транзакции, блокировки, isolation, replicas и connection pooling
Domain-Driven Design, layers, repositories, services, dependency injection
Границы сервисов, outbox, идемпотентность, события и Saga
Schema, authorization, queries, mutations и request-scoped DataLoader
Profiling, bottleneck analysis, database optimization, CDN, scaling strategies
Связный SaaS-кейс: tenant isolation, роли, подписки и usage limits
Доступен после всех тем (0 из 32)
Доступен после зачёта
Model-Template-View — принятые в Django названия частей MVC-подобного подхода. View обрабатывает HTTP-сценарий, Template формирует представление, Model описывает данные; бизнес-логика не обязана целиком жить в model.
Пример
View получает QuerySet и передаёт подготовленный context в Template.Связанные термины
Object-Relational Mapping — API Django для описания tables как Python models и построения параметризованных SQL queries. ORM не отменяет знание индексов, транзакций и плана выполнения.
Пример
Project.objects.filter(organization=organization, is_active=True)Связанные термины
Ленивое описание database query. SQL обычно выполняется при iteration, list(), len(), bool(), serialization или другой evaluation; вычисленный QuerySet кэширует результат внутри своего экземпляра.
Пример
queryset = User.objects.filter(is_active=True) # пока только строит queryСвязанные термины
Версионированная операция изменения schema/data и исторического состояния models. makemigrations создаёт migration, migrate применяет dependency graph; сгенерированный файл нужно review.
Пример
python manage.py makemigrations && python manage.py migrateСвязанные термины
Инвариант, проверяемый базой данных независимо от пути записи: UNIQUE, CHECK, PRIMARY/FOREIGN KEY. Django описывает именованные ограничения через Meta.constraints.
Пример
models.UniqueConstraint(fields=['organization', 'name'], name='project_name_in_org')Связанные термины
Метод QuerySet, загружающий ForeignKey/OneToOne через SQL JOIN. Уменьшает N+1 для одиночных relations, но слишком широкий JOIN может увеличить объём результата.
Пример
Post.objects.select_related('author')Связанные термины
Метод QuerySet, выполняющий дополнительные queries для коллекций и связывающий results в Python. Подходит ManyToMany и reverse ForeignKey; Prefetch позволяет задать фильтр и to_attr.
Пример
Post.objects.prefetch_related(Prefetch('comments', queryset=Comment.objects.filter(public=True)))Связанные термины
Ссылка на значение database field внутри query. Позволяет выполнять arithmetic/comparison на стороне БД и избегать read-modify-write race для простых updates.
Пример
Counter.objects.filter(pk=pk).update(value=F('value') + 1)Связанные термины
Объект для композиции query conditions через &, |, ^ и ~. Нужен для OR/NOT и динамического построения фильтра.
Пример
Post.objects.filter(Q(status='public') | Q(author=request.user))Связанные термины
Граница атомарности database operations. transaction.atomic() делает commit/rollback для выбранного connection, но не откатывает уже выполненный HTTP call, email или broker publish.
Пример
with transaction.atomic(): account.debit(amount); ledger.record(amount)Связанные термины
Регистрирует callback, который выполнится после успешного commit внешней transaction. Устраняет запуск side effect до commit, но сам по себе не закрывает gap между commit и broker publish.
Пример
transaction.on_commit(lambda: notify_order.delay(order.pk))Связанные термины
Один query получает N rows, затем обращение к relation выполняет ещё до N queries. Решение выбирают по связи: loading plan, aggregation или batch, а результат закрепляют query-budget test.
Пример
Post.objects.select_related('author') устраняет query на author в цикле.Связанные термины
Function-Based View — обычная callable function, принимающая request и возвращающая response. Удобна для явного небольшого flow и композиции decorators.
Пример
def health(request): return JsonResponse({'status': 'ok'})Связанные термины
Class-Based View — view как class с dispatch и method handlers. Полезна для generic behavior/mixins; глубокую и неочевидную inheritance chain лучше не строить.
Пример
path('posts/', PostListView.as_view(), name='post-list')Связанные термины
Компонент, оборачивающий Django view. Request проходит через middleware по списку внутрь, response — через вошедшие слои обратно; middleware может вернуть ранний response.
Пример
SecurityMiddleware обычно располагают близко к началу MIDDLEWARE.Связанные термины
Shortcut, который загружает template, рендерит его с context и возвращает HttpResponse. Status и content_type можно передать явно.
Пример
return render(request, 'posts/list.html', {'posts': posts}, status=200)Связанные термины
Шаблон представления, обычно HTML с Django Template Language. Он форматирует подготовленные данные и не должен скрывать database queries или критичную бизнес-логику.
Пример
{% extends 'base.html' %}{% block content %}{{ title }}{% endblock %}Связанные термины
Mapping values, доступных template во время render. Context processors добавляют общие значения, но увеличивают неявные dependencies каждого template.
Пример
return render(request, 'account.html', {'account': account})Связанные термины
Преобразование значения в Django Template Language. Filter должен быть предсказуемым и дешёвым; безопасность результата зависит от escaping/context.
Пример
{{ created_at|date:'Y-m-d' }}Связанные термины
Django class для parsing, validation и отображения входных данных, не обязательно связанных с model. Bound form хранит data/files и errors.
Пример
form = ContactForm(request.POST or None)Связанные термины
Form, создающая поля и save flow из Django model. В Meta.fields лучше перечислять разрешённые поля явно, чтобы новое model field не стало mass-assignment surface.
Пример
class ProfileForm(forms.ModelForm): class Meta: model = Profile; fields = ['display_name']Связанные термины
Запускает validation bound form и возвращает bool. При успехе данные читают из cleaned_data; при ошибке form.errors содержит структурированные сообщения.
Пример
if form.is_valid(): send_message(**form.cleaned_data)Связанные термины
Model identity, заданная AUTH_USER_MODEL. Reusable code ссылается через settings.AUTH_USER_MODEL, а runtime получает class через get_user_model(), а не импортирует built-in User напрямую.
Пример
User = get_user_model()Связанные термины
Собственная user model, обычно subclass AbstractUser для нового проекта. Её задают до первых migrations; переход после создания schema требует сложной ручной миграции relations/data.
Пример
AUTH_USER_MODEL = 'accounts.User'Связанные термины
Вызывает configured authentication backends и возвращает user либо None. Credentials зависят от backend; request следует передавать для context-aware проверок.
Пример
user = authenticate(request, username=name, password=password)Связанные термины
Decorator для FBV, требующий authenticated user и обычно перенаправляющий anonymous request на LOGIN_URL. Он не проверяет право на конкретный объект.
Пример
@login_required
def dashboard(request): ...Связанные термины
Codename права, связанный с content type; стандартно создаются add/change/delete/view. Groups агрегируют permissions, но object-level policy требует отдельной реализации.
Пример
@permission_required('blog.change_post', raise_exception=True)Связанные термины
Именованный набор Django permissions, назначаемый users. Подходит coarse-grained ролям, но не кодирует tenant/object scope автоматически.
Пример
user.groups.add(editors_group)Связанные термины
Проверка права субъекта на конкретную row/resource. Обычно queryset сначала ограничивают owner/tenant, а затем проверяют действие; frontend visibility не является защитой.
Пример
Post.objects.filter(owner=request.user).get(pk=pk)Связанные термины
Внутренний model-centric интерфейс для доверенных operators. ModelAdmin, inlines и actions ускоряют back-office, но admin не заменяет customer-facing product и требует строгих permissions/audit.
Пример
@admin.register(Post)
class PostAdmin(admin.ModelAdmin): list_display = ['title', 'status']Связанные термины
Django test class с изоляцией database через transaction/savepoints и быстрым reset между tests. Подходит большинству model/view tests, но внешний commit и некоторые lock semantics в нём не воспроизводятся.
Пример
class ProjectTests(TestCase): def test_create(self): ...Связанные термины
Более медленный Django test class, который допускает реальные commit/rollback и очищает database между tests. Нужен для on_commit, select_for_update и transaction behavior.
Пример
class CommitTests(TransactionTestCase): def test_callback_runs_after_commit(self): ...Связанные термины
In-process client для request/response tests без реального network server. Проверяет URL routing, middleware и view, но не заменяет browser/E2E и proxy deployment test.
Пример
response = self.client.get('/projects/', HTTP_HOST='acme.test')Связанные термины
Pytest plugin, который настраивает Django и управляет test database. Маркер django_db разрешает DB access; transaction=True нужен только для реального transaction behavior.
Пример
@pytest.mark.django_db
def test_project(project): assert project.pkСвязанные термины
Third-party toolkit для HTTP APIs на Django: serializers, views/viewsets, authentication, permissions, parsers, renderers, pagination и throttling.
Пример
from rest_framework.viewsets import ModelViewSetСвязанные термины
DRF class, преобразующий objects в primitive data и валидирующий input. Renderer отдельно превращает primitives в JSON; writable fields и nested writes задаются явно.
Пример
class UserSerializer(serializers.ModelSerializer): class Meta: model = User; fields = ['id', 'email']Связанные термины
DRF class, группирующий actions одного resource. Router строит routes, но queryset, permissions, pagination и transaction boundaries остаются ответственностью приложения.
Пример
class ProjectViewSet(ModelViewSet): serializer_class = ProjectSerializerСвязанные термины
Ограничение частоты requests по настроенному scope/key. Это защита fair-use, а не строгая security boundary или точный billing meter.
Пример
throttle_scope = 'reports'Связанные термины
In-process publish/subscribe hook, например post_save или m2m_changed. Подходит слабосвязанным уведомлениям, но скрытая критичная бизнес-логика усложняет порядок, transaction semantics и тестирование.
Пример
@receiver(post_save, sender=Profile)
def observe_profile_change(**kwargs): ...Связанные термины
Типизированный query language/runtime для API, где client выбирает опубликованные fields. Сервер контролирует resolvers, authorization, pagination и стоимость; один HTTP request не означает один SQL query.
Пример
query Feed { posts { title author { username } } }Связанные термины
Хранение повторно используемого результата с заранее заданной свежестью и fallback. Cache key обязан учитывать все dimensions видимости; cache не становится source of truth.
Пример
cache.set(f'project-list:v2:{organization.pk}', data, timeout=300)Связанные термины
Приложение сначала читает cache, при miss получает данные из source of truth и записывает результат. Нужны sentinel для валидного None, TTL/invalidation и защита от stampede.
Пример
value = cache.get(key, sentinel); value = load() if value is sentinel else valueСвязанные термины
Networked in-memory data store, часто используемый как cache, Celery broker или session backend. Эти роли имеют разные durability/eviction requirements и при росте могут требовать разных instances.
Пример
'BACKEND': 'django.core.cache.backends.redis.RedisCache'Связанные термины
Cross-Site Request Forgery заставляет browser с пользовательскими credentials отправить нежелательный unsafe request. Django сверяет CSRF secret/token для cookie/session-auth forms и AJAX.
Пример
{% csrf_token %}Связанные термины
Cross-Site Scripting — выполнение attacker-controlled script в origin приложения. Django autoescape помогает в HTML text/attributes, но контекст JavaScript, URL, safe/mark_safe и DOM APIs требуют отдельной защиты.
Пример
Не помещайте user input в script; передавайте data через json_script.Связанные термины
Изменение структуры SQL через непараметризованный input. QuerySet и placeholders параметризуют values, но raw SQL identifiers/order fragments требуют allowlist, а не параметра.
Пример
cursor.execute('SELECT * FROM users WHERE id = %s', [user_id])Связанные термины
Browser policy, ограничивающая источники scripts/styles/images и другие capabilities. Django 6.0 имеет built-in CSP middleware/settings; CSP дополняет escaping, а не заменяет его.
Пример
SECURE_CSP = {'default-src': [CSP.SELF], 'script-src': [CSP.SELF, CSP.NONCE]}Связанные термины
Append-oriented запись чувствительных действий: субъект, tenant, operation, object, время и correlation ID. Не должна содержать passwords, raw tokens и лишние персональные данные.
Пример
role.changed actor=42 organization=7 target=membership:91Связанные термины
Синхронный Python web server interface. Django WSGI deployment хорошо подходит обычному request/response; async view под WSGI запускается без преимуществ целого ASGI stack.
Пример
gunicorn project.wsgi:applicationСвязанные термины
Async server/application interface для HTTP и долгоживущих protocols. Django ASGI deployment раскрывает преимущества async views только при совместимом middleware и I/O stack.
Пример
uvicorn project.asgi:applicationСвязанные термины
Django view, объявленная async def. Она конкурентно ждёт non-blocking I/O под ASGI, но не ускоряет CPU work, database lock или плохо спланированный query.
Пример
async def status(request): data = await client.fetch(); return JsonResponse(data)Связанные термины
Долгоживущий двунаправленный protocol поверх одного connection. Требует authentication lifecycle, heartbeat, backpressure, connection limits и cleanup.
Пример
Django Channels consumer принимает websocket.connect/receive/disconnect.Связанные термины
Third-party ASGI integration для WebSockets/consumers/channel layers. Channel layer — транспорт сообщений, а не durable database или универсальная background queue.
Пример
path('ws/notifications/', NotificationsConsumer.as_asgi())Связанные термины
Distributed task queue, где producer публикует message через broker, worker выполняет task, а Beat публикует schedule. Delivery обычно at-least-once, поэтому task должна быть idempotent.
Пример
send_report.delay_on_commit(report.pk)Связанные термины
Новое в Django 6.0 API для определения/enqueue задач и backend abstraction. Django не поставляет production worker; built-in backends предназначены для development/testing.
Пример
result = send_email.enqueue(user_id=42)Связанные термины
Один из способов собрать immutable application image и изолировать runtime dependencies. Django можно надёжно deploy и без containers; Docker не заменяет secrets, migrations, health checks и backup.
Пример
FROM python:3.12-slimСвязанные термины
Декларативный запуск нескольких containers, особенно удобный для local development, CI и небольших controlled deployments. Сам по себе не даёт zero-downtime, autoscaling или managed secrets.
Пример
docker compose up --buildСвязанные термины
Pre-fork Python application server, традиционно используемый для WSGI. Для ASGI с Gunicorn применяют актуальный external worker package либо запускают ASGI server напрямую.
Пример
gunicorn project.wsgi:application --workers 4Связанные термины
Web server/reverse proxy для TLS termination, routing, buffering, static files и limits. Это распространённый, но не обязательный выбор: ту же роль может выполнять managed edge/load balancer.
Пример
proxy_pass http://django_upstream;Связанные термины
Error/performance monitoring platform для группировки exceptions, releases и traces. Перед отправкой контекста настраивают sampling и удаление secrets/PII.
Пример
sentry_sdk.init(dsn=settings.SENTRY_DSN, send_default_pii=False)Связанные термины
Time-series monitoring system с metric labels и PromQL. Labels должны иметь bounded cardinality: user/request/tenant ID обычно не подходят.
Пример
http_requests_total{route='/projects/:id', status='200'}Связанные термины
Подход к сложному domain через ubiquitous language, bounded contexts и явные business invariants. DDD не требует отдельного repository/interface для каждой Django model.
Пример
Billing и Fulfillment моделируют разные значения слова Order в разных contexts.Связанные термины
Интерфейс коллекции domain objects, скрывающий storage details. В Django он полезен при реальной смене/композиции хранилищ, но тонкая обёртка над каждым QuerySet часто лишь дублирует ORM.
Пример
orders = order_repository.pending_for_account(account_id)Связанные термины
Одно deployment-приложение с явными business modules, ownership и public boundaries. Сохраняет локальные transactions/refactoring и может подготовить осознанное извлечение service.
Пример
billing вызывает public API orders, но не импортирует его private models.Связанные термины
Стиль, где independently owned business capabilities имеют собственные contracts, data ownership, deployment и operations. Маленький container без автономии остаётся частью distributed monolith.
Пример
Billing владеет invoices и публикует InvoicePaid, не разделяя tables с Orders.Связанные термины
Business change и event/message сохраняются одной database transaction. Отдельный dispatcher повторяет publish; consumers всё равно обрабатывают duplicates идемпотентно.
Пример
Order и OutboxEvent создаются внутри одного transaction.atomic().Связанные термины
Повтор одной logical operation с тем же key не создаёт второй бизнес-эффект. Особенно важна для POST, webhooks и at-least-once task delivery.
Пример
UniqueConstraint(provider, event_id) дедуплицирует webhook delivery.Связанные термины
Гарантия, что субъект одной organization не читает и не меняет данные другой. Scope применяют до object lookup, закрепляют constraints/tests и при необходимости усиливают RLS/schema/database boundary.
Пример
Project.objects.for_tenant(request.organization).get(pk=pk)Связанные термины
Состав курса, уровни, практика и способы проверки знаний.
Курс включает 32 темы и 320 вопросов с разбором ответа. Начать можно с первой темы курса.
Маршрут охватывает уровни Junior, Middle, Senior. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.
После прохождения тем доступен зачёт по курсу «Django: от основ до production» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.
Да, курс полностью бесплатный: все 32 темы доступны без оплаты.