Python: Разработка на фреймворке Django
2026-02-26 20:25 Diff

Любой веб-проект достаточно быстро перестает помещаться в рамках одного пакета: становится слишком много views и urlpatterns. Чтобы контролировать процесс роста, мы можем использовать стандартный для Python прием декомпозиции — превращение модуля в пакет с подмодулями.

В случае views.py это даже сработает. Но разделить на части правила роутинга — элементы списка urlpatterns в urls.py — будет уже сложновато. Придется вручную собирать список правил из отдельных кусочков.

Django позволяет не придумывать свои способы управления сложностью. В фреймворке уже есть готовый паттерн — приложения или applications.

В этом уроке разберем, как приложения помогают организовать код в больших проектах, а также научимся создавать его и добавлять маршрутизацию.

Каждое приложение представляет собой пакет с модулями, который включает в себя модуль описания моделей и вьюх. Также в него часто входят свои шаблоны и свои же urlpatterns. Приложения часто выглядят как миниатюрные, но самостоятельные веб-приложения. Эта самостоятельность помогает реализовывать переиспользуемые приложения, которые решают типовые задачи.

Сам фреймворк Django предоставляет набор таких приложений-кирпичиков, которые помогают быстро заложить фундамент проекта.

Создаем первое приложение

У нас уже есть одно приложение — пакет hexlet_django_blog. Самый первый пакет, который мы создаем при запуске uv run django-admin startproject, может и не быть приложением. Его задача: описать точки входа в веб-приложение. В этом пакете задаются настройки всего приложения и корневые urlpatterns.

Мы сделали пакет hexlet_django_blog приложением, когда добавили его в settings.INSTALLED_APPS.

Этот список содержит перечень всех Django applications, которые подключены к текущему проекту. Многие механизмы фреймворка обращаются к этому перечню во время своей работы. Так встроенный загрузчик шаблонов (Template Loader) ищет их в поддиректориях с именем templates во всех подключенных приложениях. Для этого мы подключили hexlet_django_blog в роли приложения — чтобы загрузчик шаблонов нашел наш первый шаблон.

Чтобы создать новое приложение, нужно перейти в директорию пакета hexlet_django_blog и выполнить uv run django-admin startapp article. В результате создастся приложение следующего вида с точки зрения корня проекта:

Здесь модуль models.py и пакет migrations относятся к слою хранения. Они пока нас не интересуют. tests.py описывает тесты, admin.py описывает админку — на это мы тоже пока не обращаем внимание. А вот views.py нам пригодится.

Чтобы закончить создание болванки приложения, остается задать его имя в файле apps.py и подключить в settings.INSTALLED_APPS. Для этого в качестве имени мы указываем полный путь к приложению:

Далее добавляем имя приложения в список:

Приложение создано и подключено.

Добавляем маршрутизацию

По умолчанию в приложении не генерируется модуль urls.py. Дело в том, что приложение может и не быть настолько большим, чтобы потребовался отдельный набор правил маршрутизации. Такие небольшие приложения прописывают в urls.py уровнем выше. Но мы будем делать большое приложение, поэтому смело создаем файл hexlet_django_blog/article/urls.py следующего вида:

Пока все максимально похоже на корневой urls.py — мы снова связали пустой путь с вьюхой views.index, но уже из этого приложения.

Теперь нужно связать urlpatterns приложения с urlpatterns проекта. Модифицируем hexlet_django_blog/urls.py:

С этого момента все пути, которые начинаются с "articles/", будут перенаправляться в hexlet_django_blog.article.urls. В приложении у нас уже приписана view index, которая связана с путем ''. Это означает, что запрос по пути articles/ без каких либо продолжений будет направлен в hexlet_django_blog.article.views.index.

Мы встроили приложение в проект по префиксу пути. Переиспользуемые приложения обычно встраиваются именно таким образом. Префикс articles/ задается вне встраиваемого приложения, поэтому приложение может быть встроено в любой проект по любому префиксу. И правила маршрутизации этого приложения не будут конфликтовать с правилами проекта и других приложений.

Реализуем view

View у нас прописана в правилах маршрутизации. Реализуем ее:

Если теперь открыть в браузере адрес localhost:8000/articles/, то мы увидим текст "article".

Здесь view возвращает HttpResponse с указанным телом ответа, вместо того чтобы использовать шаблон. В модуле django.http вы найдете JsonResponse, который позволяет возвращать данные в виде JSON и FileResponse. Он нужен для отправки клиенту файлов.