Любой веб-проект достаточно быстро перестает помещаться в рамках одного пакета: становится слишком много views и urlpatterns. Чтобы контролировать процесс роста, мы можем использовать стандартный для Python прием декомпозиции — превращение модуля в пакет с подмодулями.
В случае views.py это даже сработает. Но разделить на части правила роутинга — элементы списка urlpatterns
в urls.py — будет уже сложновато. Придется вручную собирать список правил из отдельных кусочков.
Django позволяет не придумывать свои способы управления сложностью. В фреймворке уже есть готовый паттерн — приложения или applications.
В этом уроке разберем, как приложения помогают организовать код в больших проектах, а также научимся создавать его и добавлять маршрутизацию.
Каждое приложение представляет собой пакет с модулями, который включает в себя модуль описания моделей и вьюх. Также в него часто входят свои шаблоны и свои же urlpatterns. Приложения часто выглядят как миниатюрные, но самостоятельные веб-приложения. Эта самостоятельность помогает реализовывать переиспользуемые приложения, которые решают типовые задачи.
Сам фреймворк Django предоставляет набор таких приложений-кирпичиков, которые помогают быстро заложить фундамент проекта.
Создаем первое приложение
У нас уже есть одно приложение — пакет hexlet_django_blog. Самый первый пакет, который мы создаем при запуске django-admin startproject
, может и не быть приложением. Его задача: описать точки входа в веб-приложение. В этом пакете задаются настройки всего приложения и корневые urlpatterns.
Мы сделали пакет hexlet_django_blog приложением, когда добавили его в settings.INSTALLED_APPS
.
Этот список содержит перечень всех Django applications, которые подключены к текущему проекту. Многие механизмы фреймворка обращаются к этому перечню во время своей работы. Так встроенный загрузчик шаблонов (Template Loader) ищет их в поддиректориях с именем templates во всех подключенных приложениях. Для этого мы подключили hexlet_django_blog
в роли приложения — чтобы загрузчик шаблонов нашел наш первый шаблон.
Чтобы создать новое приложение, нужно перейти в директорию пакета hexlet_django_blog и выполнить django-admin startapp article
. В результате создастся приложение следующего вида с точки зрения корня проекта:
tree hexlet_django_blog/article
hexlet_django_blog/article
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
Здесь модуль models.py и пакет migrations относятся к слою хранения. Они пока нас не интересуют. tests.py описывает тесты, admin.py описывает админку — на это мы тоже пока не обращаем внимание. А вот views.py нам пригодится.
Чтобы закончить создание болванки приложения, остается задать его имя в файле apps.py и подключить в settings.INSTALLED_APPS
. Для этого в качестве имени мы указываем полный путь к приложению:
# hexlet_django_blog/article/apps.py
class ArticleConfig(AppConfig):
...
name = 'hexlet_django_blog.article' # <- изменяем эту строчку
Далее добавляем имя приложения в список:
# hexlet_django_blog/settings.py
INSTALLED_APPS = [
...
'hexlet_django_blog',
'hexlet_django_blog.article', # <- добавляем эту строчку
]
Приложение создано и подключено.
Добавляем маршрутизацию
По умолчанию в приложении не генерируется модуль urls.py. Дело в том, что приложение может и не быть настолько большим, чтобы потребовался отдельный набор правил маршрутизации. Такие небольшие приложения прописывают в urls.py уровнем выше. Но мы будем делать большое приложение, поэтому смело создаем файл hexlet_django_blog/article/urls.py следующего вида:
from django.urls import path
from hexlet_django_blog.article import views
urlpatterns = [
path('', views.index),
]
Пока все максимально похоже на корневой urls.py — мы снова связали пустой путь с вьюхой views.index, но уже из этого приложения.
Теперь нужно связать urlpatterns приложения с urlpatterns проекта. Модифицируем hexlet_django_blog/urls.py:
from django.urls import path, include # <- добавлен include
from hexlet_django_blog import views
urlpatterns = [
path('', views.index),
path('articles/', include('hexlet_django_blog.article.urls')), # <- новая строчка
path('admin/', admin.site.urls),
]
С этого момента все пути, которые начинаются с "articles/", будут перенаправляться в hexlet_django_blog.article.urls
. В приложении у нас уже приписана view index
, которая связана с путем ''
. Это означает, что запрос по пути articles/
без каких либо продолжений будет направлен в hexlet_django_blog.article.views.index
.
Мы встроили приложение в проект по префиксу пути. Переиспользуемые приложения обычно встраиваются именно таким образом. Префикс articles/
задается вне встраиваемого приложения, поэтому приложение может быть встроено в любой проект по любому префиксу. И правила маршрутизации этого приложения не будут конфликтовать с правилами проекта и других приложений.
Реализуем view
View у нас прописана в правилах маршрутизации. Реализуем ее:
# hexlet_django_blog/article/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse('article')
Если теперь открыть в браузере адрес localhost:8000/articles/
, то мы увидим текст "article".
Здесь view возвращает HttpResponse
с указанным телом ответа, вместо того чтобы использовать шаблон. В модуле django.http вы найдете JsonResponse
, который позволяет возвращать данные в виде JSON и FileResponse
. Он нужен для отправки клиенту файлов.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.