Skip to content

Latest commit

 

History

History
268 lines (183 loc) · 12.2 KB

File metadata and controls

268 lines (183 loc) · 12.2 KB

Урок 1. Django и архитектура MTV. Создание первого проекта. Инструменты

Что мы уже умеем и зачем нам Django

В прошлом курсе мы строили бэкенд с нуля: писали SQL-запросы, подключали базу данных через sqlite3, описывали маршруты и обработчики в FastAPI, валидировали данные через Pydantic. Это был намеренно «голый» подход — чтобы понять, что происходит внутри каждого слоя.

Django решает те же задачи, но иначе: большинство инфраструктурного кода уже написано за тебя. Маршрутизация, работа с базой данных, валидация форм, авторизация пользователей, административный интерфейс — всё это встроено. Твоя задача — настроить и расширить, а не писать с нуля.

При этом Django — это не просто фреймворк для API. Это инструмент для создания законченного веб-приложения: от базы данных до HTML-страниц, которые видит пользователь в браузере. Именно это отличает его от FastAPI, который мы использовали раньше: FastAPI отдаёт данные в формате JSON, Django умеет отдавать готовые HTML-страницы.


Архитектура MTV

Если ты сталкивался с другими фреймворками, ты мог встречать аббревиатуру 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 — на твой выбор

Создаём виртуальное окружение и устанавливаем Django

Виртуальное окружение — это изолированная папка с зависимостями проекта. Мы уже работали с этим в прошлом курсе, поэтому не останавливаемся подробно.

# Создаём папку проекта и переходим в неё
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 --version

Создание проекта

Django разделяет два понятия, которые легко перепутать в начале: проект и приложение.

  • Проект — это вся конфигурация: настройки, корневые маршруты, точка входа. Один проект существует в единственном числе.
  • Приложение — это отдельный модуль с конкретной функциональностью. В одном проекте может быть несколько приложений: например, 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, а не наш контент. Напишем первое собственное представление.

views.py

Открываем films/views.py:

from django.http import HttpResponse


def index(request):
    return HttpResponse('Добро пожаловать на сайт фильмов!')

request — это объект с информацией о входящем запросе: метод (GET/POST), данные, пользователь. Django передаёт его в каждое представление автоматически.

urls.py приложения

Создаём новый файл films/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

Подключаем к корневому urls.py

Открываем 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/ — видим нашу строку.


Вопросы

  1. Чем Django отличается от FastAPI, который мы использовали раньше?
  2. В архитектуре MTV за что отвечает View? Почему это может сбивать с толку?
  3. В чём разница между проектом и приложением в Django?
  4. Зачем нужна функция include() в корневом urls.py?
  5. Что произойдёт, если создать приложение через startapp, но не добавить его в INSTALLED_APPS?

Практическая задача

Тип: расширь проект

У тебя уже есть работающее представление index по адресу /. Добавь второе представление — страницу «О сайте».

Требования:

  1. Представление называется about и находится в films/views.py
  2. Оно доступно по адресу /about/
  3. Возвращает любой текст, описывающий сайт — например: 'Сайт-каталог фильмов. Здесь собраны лучшие фильмы всех времён.'
  4. Маршрут имеет имя about

Следующий урок