0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Любой веб-проект достаточно быстро перестает помещаться в рамках одного пакета: становится слишком много views и urlpatterns. Чтобы контролировать процесс роста, мы можем использовать стандартный для Python прием<strong>декомпозиции</strong>- превращение модуля в пакет с подмодулями.</p>
1
<p>Любой веб-проект достаточно быстро перестает помещаться в рамках одного пакета: становится слишком много views и urlpatterns. Чтобы контролировать процесс роста, мы можем использовать стандартный для Python прием<strong>декомпозиции</strong>- превращение модуля в пакет с подмодулями.</p>
2
<p>В случае<em>views.py</em>это даже сработает. Но разделить на части<strong>правила роутинга</strong>- элементы списка urlpatterns в<em>urls.py</em>- будет уже сложновато. Придется вручную собирать список правил из отдельных кусочков.</p>
2
<p>В случае<em>views.py</em>это даже сработает. Но разделить на части<strong>правила роутинга</strong>- элементы списка urlpatterns в<em>urls.py</em>- будет уже сложновато. Придется вручную собирать список правил из отдельных кусочков.</p>
3
<p>Django позволяет не придумывать свои способы управления сложностью. В фреймворке уже есть готовый паттерн -<strong>приложения</strong>или<strong>applications</strong>.</p>
3
<p>Django позволяет не придумывать свои способы управления сложностью. В фреймворке уже есть готовый паттерн -<strong>приложения</strong>или<strong>applications</strong>.</p>
4
<p>В этом уроке разберем, как приложения помогают организовать код в больших проектах, а также научимся создавать его и добавлять маршрутизацию.</p>
4
<p>В этом уроке разберем, как приложения помогают организовать код в больших проектах, а также научимся создавать его и добавлять маршрутизацию.</p>
5
<p>Каждое приложение представляет собой пакет с модулями, который включает в себя модуль описания моделей и вьюх. Также в него часто входят свои шаблоны и свои же urlpatterns. Приложения часто выглядят как миниатюрные, но самостоятельные веб-приложения. Эта самостоятельность помогает реализовывать переиспользуемые приложения, которые решают типовые задачи.</p>
5
<p>Каждое приложение представляет собой пакет с модулями, который включает в себя модуль описания моделей и вьюх. Также в него часто входят свои шаблоны и свои же urlpatterns. Приложения часто выглядят как миниатюрные, но самостоятельные веб-приложения. Эта самостоятельность помогает реализовывать переиспользуемые приложения, которые решают типовые задачи.</p>
6
<p>Сам фреймворк Django предоставляет набор таких приложений-кирпичиков, которые помогают быстро заложить фундамент проекта.</p>
6
<p>Сам фреймворк Django предоставляет набор таких приложений-кирпичиков, которые помогают быстро заложить фундамент проекта.</p>
7
<h2>Создаем первое приложение</h2>
7
<h2>Создаем первое приложение</h2>
8
<p>У нас уже есть одно приложение - пакет<em>hexlet_django_blog</em>. Самый первый пакет, который мы создаем при запуске uv run django-admin startproject, может и не быть приложением. Его задача: описать точки входа в веб-приложение. В этом пакете задаются настройки всего приложения и корневые urlpatterns.</p>
8
<p>У нас уже есть одно приложение - пакет<em>hexlet_django_blog</em>. Самый первый пакет, который мы создаем при запуске uv run django-admin startproject, может и не быть приложением. Его задача: описать точки входа в веб-приложение. В этом пакете задаются настройки всего приложения и корневые urlpatterns.</p>
9
<p>Мы сделали пакет<em>hexlet_django_blog</em>приложением, когда добавили его в settings.INSTALLED_APPS.</p>
9
<p>Мы сделали пакет<em>hexlet_django_blog</em>приложением, когда добавили его в settings.INSTALLED_APPS.</p>
10
<p>Этот список содержит перечень всех Django applications, которые подключены к текущему проекту. Многие механизмы фреймворка обращаются к этому перечню во время своей работы. Так встроенный загрузчик шаблонов (Template Loader) ищет их в поддиректориях с именем<em>templates</em>во всех подключенных приложениях. Для этого мы подключили hexlet_django_blog в роли приложения - чтобы загрузчик шаблонов нашел наш первый шаблон.</p>
10
<p>Этот список содержит перечень всех Django applications, которые подключены к текущему проекту. Многие механизмы фреймворка обращаются к этому перечню во время своей работы. Так встроенный загрузчик шаблонов (Template Loader) ищет их в поддиректориях с именем<em>templates</em>во всех подключенных приложениях. Для этого мы подключили hexlet_django_blog в роли приложения - чтобы загрузчик шаблонов нашел наш первый шаблон.</p>
11
<p>Чтобы создать новое приложение, нужно перейти в директорию пакета<em>hexlet_django_blog</em>и выполнить uv run django-admin startapp article. В результате создастся приложение следующего вида с точки зрения корня проекта:</p>
11
<p>Чтобы создать новое приложение, нужно перейти в директорию пакета<em>hexlet_django_blog</em>и выполнить uv run django-admin startapp article. В результате создастся приложение следующего вида с точки зрения корня проекта:</p>
12
<p>Здесь модуль<em>models.py</em>и пакет<em>migrations</em>относятся к слою хранения. Они пока нас не интересуют.<em>tests.py</em>описывает тесты,<em>admin.py</em>описывает админку - на это мы тоже пока не обращаем внимание. А вот<em>views.py</em>нам пригодится.</p>
12
<p>Здесь модуль<em>models.py</em>и пакет<em>migrations</em>относятся к слою хранения. Они пока нас не интересуют.<em>tests.py</em>описывает тесты,<em>admin.py</em>описывает админку - на это мы тоже пока не обращаем внимание. А вот<em>views.py</em>нам пригодится.</p>
13
<p>Чтобы закончить создание болванки приложения, остается задать его имя в файле<em>apps.py</em>и подключить в settings.INSTALLED_APPS. Для этого в качестве имени мы указываем полный путь к приложению:</p>
13
<p>Чтобы закончить создание болванки приложения, остается задать его имя в файле<em>apps.py</em>и подключить в settings.INSTALLED_APPS. Для этого в качестве имени мы указываем полный путь к приложению:</p>
14
<p>Далее добавляем имя приложения в список:</p>
14
<p>Далее добавляем имя приложения в список:</p>
15
<p>Приложение создано и подключено.</p>
15
<p>Приложение создано и подключено.</p>
16
<h2>Добавляем маршрутизацию</h2>
16
<h2>Добавляем маршрутизацию</h2>
17
<p>По умолчанию в приложении не генерируется модуль<em>urls.py</em>. Дело в том, что приложение может и не быть настолько большим, чтобы потребовался отдельный набор правил маршрутизации. Такие небольшие приложения прописывают в<em>urls.py</em>уровнем выше. Но мы будем делать большое приложение, поэтому смело создаем файл<em>hexlet_django_blog/article/urls.py</em>следующего вида:</p>
17
<p>По умолчанию в приложении не генерируется модуль<em>urls.py</em>. Дело в том, что приложение может и не быть настолько большим, чтобы потребовался отдельный набор правил маршрутизации. Такие небольшие приложения прописывают в<em>urls.py</em>уровнем выше. Но мы будем делать большое приложение, поэтому смело создаем файл<em>hexlet_django_blog/article/urls.py</em>следующего вида:</p>
18
<p>Пока все максимально похоже на корневой urls.py - мы снова связали пустой путь с вьюхой<em>views.index</em>, но уже из этого приложения.</p>
18
<p>Пока все максимально похоже на корневой urls.py - мы снова связали пустой путь с вьюхой<em>views.index</em>, но уже из этого приложения.</p>
19
<p>Теперь нужно связать urlpatterns приложения с urlpatterns проекта. Модифицируем<em>hexlet_django_blog/urls.py</em>:</p>
19
<p>Теперь нужно связать urlpatterns приложения с urlpatterns проекта. Модифицируем<em>hexlet_django_blog/urls.py</em>:</p>
20
<p>С этого момента все пути, которые начинаются с "articles/", будут перенаправляться в hexlet_django_blog.article.urls. В приложении у нас уже приписана view index, которая связана с путем ''. Это означает, что запрос по пути articles/ без каких либо продолжений будет направлен в hexlet_django_blog.article.views.index.</p>
20
<p>С этого момента все пути, которые начинаются с "articles/", будут перенаправляться в hexlet_django_blog.article.urls. В приложении у нас уже приписана view index, которая связана с путем ''. Это означает, что запрос по пути articles/ без каких либо продолжений будет направлен в hexlet_django_blog.article.views.index.</p>
21
<p>Мы встроили приложение в проект по префиксу пути. Переиспользуемые приложения обычно встраиваются именно таким образом. Префикс articles/ задается вне встраиваемого приложения, поэтому приложение может быть встроено в любой проект по любому префиксу. И правила маршрутизации этого приложения не будут конфликтовать с правилами проекта и других приложений.</p>
21
<p>Мы встроили приложение в проект по префиксу пути. Переиспользуемые приложения обычно встраиваются именно таким образом. Префикс articles/ задается вне встраиваемого приложения, поэтому приложение может быть встроено в любой проект по любому префиксу. И правила маршрутизации этого приложения не будут конфликтовать с правилами проекта и других приложений.</p>
22
<h2>Реализуем view</h2>
22
<h2>Реализуем view</h2>
23
<p>View у нас прописана в правилах маршрутизации. Реализуем ее:</p>
23
<p>View у нас прописана в правилах маршрутизации. Реализуем ее:</p>
24
<p>Если теперь открыть в браузере адрес localhost:8000/articles/, то мы увидим текст "article".</p>
24
<p>Если теперь открыть в браузере адрес localhost:8000/articles/, то мы увидим текст "article".</p>
25
<p>Здесь view возвращает HttpResponse с указанным телом ответа, вместо того чтобы использовать шаблон. В модуле<a>django.http</a>вы найдете JsonResponse, который позволяет возвращать данные в виде JSON и FileResponse. Он нужен для отправки клиенту файлов.</p>
25
<p>Здесь view возвращает HttpResponse с указанным телом ответа, вместо того чтобы использовать шаблон. В модуле<a>django.http</a>вы найдете JsonResponse, который позволяет возвращать данные в виде JSON и FileResponse. Он нужен для отправки клиенту файлов.</p>