В прошлом курсе мы строили бэкенд с нуля: писали SQL-запросы, подключали базу данных через sqlite3, описывали маршруты и обработчики в FastAPI, валидировали данные через Pydantic. Это был намеренно «голый» подход — чтобы понять, что происходит внутри каждого слоя.
Django решает те же задачи, но иначе: большинство инфраструктурного кода уже написано за тебя. Маршрутизация, работа с базой данных, валидация форм, авторизация пользователей, административный интерфейс — всё это встроено. Твоя задача — настроить и расширить, а не писать с нуля.
При этом Django — это не просто фреймворк для API. Это инструмент для создания законченного веб-приложения: от базы данных до HTML-страниц, которые видит пользователь в браузере. Именно это отличает его от FastAPI, который мы использовали раньше: FastAPI отдаёт данные в формате JSON, Django умеет отдавать готовые HTML-страницы.
Если ты сталкивался с другими фреймворками, ты мог встречать аббревиатуру MVC — Model, View, Controller. Django использует ту же идею, но называет её иначе: MTV — Model, Template, View.
Путаница в названиях реальная, поэтому зафиксируем сразу:
| MTV (Django) | MVC (классика) | За что отвечает |
|---|---|---|
| Model | Model | Структура данных, работа с БД |
| Template | View | HTML-шаблон — то, что видит пользователь |
| View | Controller | Логика обработки запроса |
Главная ловушка: Django-View — это не визуальная часть, а именно логика. Принять запрос, обратиться к модели, передать данные в шаблон, вернуть ответ.
Схема одного запроса в Django:
Браузер отправляет запрос
↓
urls.py — находит нужный маршрут
↓
views.py — обрабатывает запрос, запрашивает данные
↓
models.py — идёт в БД, возвращает данные
↓
шаблон .html — данные вставляются в HTML
↓
Браузер получает готовую страницу
На протяжении всего курса мы будем возвращаться к этой схеме — сначала она кажется абстрактной, но после первых же рабочих страниц всё встаёт на свои места.
- Python 3.12+ — устанавливается с официального сайта python.org
- pip — идёт в комплекте с Python
- venv — встроенный модуль для виртуальных окружений
- PyCharm или VS Code — на твой выбор
Виртуальное окружение — это изолированная папка с зависимостями проекта. Мы уже работали с этим в прошлом курсе, поэтому не останавливаемся подробно.
# Создаём папку проекта и переходим в неё
mkdir filmsite
cd filmsite
# Создаём виртуальное окружение
python -m venv venv
# Активируем (macOS/Linux)
source venv/bin/activate
# Активируем (Windows)
venv\Scripts\activate
# Устанавливаем Django
pip install django
# Проверяем версию
python -m django --versionDjango разделяет два понятия, которые легко перепутать в начале: проект и приложение.
- Проект — это вся конфигурация: настройки, корневые маршруты, точка входа. Один проект существует в единственном числе.
- Приложение — это отдельный модуль с конкретной функциональностью. В одном проекте может быть несколько приложений: например,
films,users,reviews.
django-admin startproject filmsite .Точка в конце важна — она говорит Django создать файлы прямо в текущей папке, а не вкладывать их в лишнюю директорию.
После выполнения команды структура выглядит так:
filmsite/
├── manage.py
└── filmsite/
├── __init__.py
├── settings.py
├── urls.py
├── asgi.py
└── wsgi.py
Разберём, что здесь что:
| Файл | Назначение |
|---|---|
manage.py |
Утилита для управления проектом: запуск сервера, миграции, создание приложений |
settings.py |
Все настройки проекта: база данных, установленные приложения, статические файлы |
urls.py |
Корневой файл маршрутов — отсюда запросы расходятся по приложениям |
wsgi.py / asgi.py |
Точки входа для продакшн-сервера, на этапе разработки не трогаем |
python manage.py startapp filmsТеперь структура расширяется:
filmsite/
├── manage.py
├── filmsite/
│ ├── settings.py
│ ├── urls.py
│ └── ...
└── films/
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py
Приложение films создано, но Django о нём пока не знает. Нужно зарегистрировать его в настройках.
Открываем filmsite/settings.py и добавляем наше приложение в список INSTALLED_APPS:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'films', # наше приложение
]Обрати внимание: Django поставляется с набором встроенных приложений.
django.contrib.admin— это та самая административная панель, которую мы подробно разберём в модуле 4.django.contrib.auth— система авторизации из модуля 7. Они уже здесь, просто пока работают в фоне.
python manage.py runserverВ терминале появится:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). ...
Django version 5.x, using settings 'filmsite.settings'
Starting development server at http://127.0.0.1:8000/
Открываем браузер по адресу http://127.0.0.1:8000/ — видим стартовую страницу Django с ракетой. Проект работает.
Предупреждение про unapplied migration(s) — это нормально. Django говорит, что встроенные приложения хотят создать свои таблицы в базе данных. Разберёмся с миграциями в модуле 3, а пока это предупреждение не мешает работе.
Сайт запускается, но показывает стартовую страницу Django, а не наш контент. Напишем первое собственное представление.
Открываем films/views.py:
from django.http import HttpResponse
def index(request):
return HttpResponse('Добро пожаловать на сайт фильмов!')request — это объект с информацией о входящем запросе: метод (GET/POST), данные, пользователь. Django передаёт его в каждое представление автоматически.
Создаём новый файл films/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]Открываем filmsite/urls.py и подключаем маршруты приложения:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('films.urls')),
]Функция include() говорит Django: «все запросы, которые начинаются с пустого пути, передавай в файл маршрутов приложения films».
Перезапускаем сервер (или он перезапустится сам) и открываем http://127.0.0.1:8000/ — видим нашу строку.
- Чем Django отличается от FastAPI, который мы использовали раньше?
- В архитектуре MTV за что отвечает
View? Почему это может сбивать с толку? - В чём разница между проектом и приложением в Django?
- Зачем нужна функция
include()в корневомurls.py? - Что произойдёт, если создать приложение через
startapp, но не добавить его вINSTALLED_APPS?
Тип: расширь проект
У тебя уже есть работающее представление index по адресу /. Добавь второе представление — страницу «О сайте».
Требования:
- Представление называется
aboutи находится вfilms/views.py - Оно доступно по адресу
/about/ - Возвращает любой текст, описывающий сайт — например:
'Сайт-каталог фильмов. Здесь собраны лучшие фильмы всех времён.' - Маршрут имеет имя
about