Django в production
Все объяснения, задачи и лабораторная в одном месте.
Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.
1. Проект, settings и приложения
Объяснение
Проект содержит настройки развёртывания, приложение — предметную область. DEBUG предназначен для разработки. Секретный ключ и разрешённые hosts зависят от окружения. URLconf сопоставляет путь обработчику.
Задача для самостоятельного решения
Почему DEBUG нельзя оставлять в публичном окружении?
Показать разбор ответа
Страницы ошибки раскрывают внутреннее состояние. Отключите DEBUG, задайте ALLOWED_HOSTS и организуйте серверный журнал ошибок.
2. Models, ORM и миграции
Объяснение
Model описывает данные, migration — изменение схемы. ORM не отменяет индексы и ограничения БД. select_related загружает одиночные связи через JOIN, prefetch_related выполняет отдельные запросы для коллекций.
Задача для самостоятельного решения
Как получить авторов ста статей без ста дополнительных запросов?
Показать разбор ответа
Для ForeignKey автора используйте select_related. Проверьте число SQL-запросов; выбор всех колонок и слишком крупных связей также имеет стоимость.
3. Views, templates и forms
Объяснение
View обрабатывает запрос, form проверяет ввод, template представляет результат. Серверная валидация обязательна даже при браузерных ограничениях. Redirect после POST предотвращает случайную повторную отправку при обновлении.
Задача для самостоятельного решения
Пользователь обошёл required в HTML. Будет ли поле проверено?
Показать разбор ответа
Только если проверка есть на сервере: вызывайте is_valid и используйте cleaned_data. Значения request.POST сами по себе не доверенные.
4. Auth, permissions и CSRF
Объяснение
CSRF защищает действия с автоматически отправляемыми cookies от межсайтовой подделки. Проверка CSRF не заменяет permissions. Автоэкранирование шаблонов помогает против XSS, пока опасный HTML не объявлен безопасным.
Задача для самостоятельного решения
Достаточно ли CSRF-токена для удаления чужого объекта?
Показать разбор ответа
Нет: токен подтверждает контекст запроса, но не право на объект. Нужна отдельная проверка владельца или разрешения.
5. Тесты, static/media и admin
Объяснение
Static — ресурсы приложения, media — пользовательские загрузки. Загруженный файл нельзя считать безопасным по расширению. Тесты должны проверять анонимного пользователя, владельца и пользователя без права.
Задача для самостоятельного решения
Можно ли исполнять загруженные файлы как серверный код?
Показать разбор ответа
Нет. Храните uploads отдельно, ограничивайте размер и типы, выдавайте с безопасными заголовками. Пользовательский файл не должен попадать в каталог исполняемых шаблонов.
6. Gunicorn, reverse proxy и monitoring
Объяснение
WSGI-сервер исполняет приложение, reverse proxy принимает внешние соединения. Доверять forwarded headers можно только от известного proxy. Миграции и перезапуск нужно согласовывать с совместимостью схемы.
Задача для самостоятельного решения
Почему изменение схемы и кода лучше делать совместимыми этапами?
Показать разбор ответа
Во время rolling deployment существуют старые и новые workers. Сначала добавьте совместимую схему, затем код и только потом удаляйте устаревшие поля.
Лабораторная работа
Подготовка
Учебный Django project с приложением catalog; фрагменты модели и запроса в соответствующих модулях.
Учебный пример
from django.db import models
class Course(models.Model):
title = models.CharField(max_length=200)
published = models.BooleanField(default=False)
# В Django shell после создания и применения миграций:
# Course.objects.create(title="Основы", published=True)
# list(Course.objects.filter(published=True).values_list("title", flat=True))Как работает пример и что ожидать
После migrations и вставки запрос возвращает список с «Основы». Boolean default=False предотвращает случайную публикацию. Это модель и запрос, не готовый сервер; подключение приложения, migrate и URL/view — следующие этапы проекта.
Итоговая работа
Добавьте list/detail, форму с CSRF, роли автора и редактора, тест чужого объекта. Выполните миграцию на копии базы, измерьте SQL-запросы списка и подготовьте production settings без DEBUG.
Проверка результата
1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.
Как оценить работу
По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.