Любой Web-проект достаточно быстро перестаёт "помещаться" в рамках одного пакета: становится слишком много views и urlpatterns. Чтобы контролировать процесс роста, мы можем использовать стандартный для Python приём декомпозиции — превращение модуля в пакет с подмодулями.
В случае views.py
это даже сработает, но вот разделить на части правила роутинга (те самые элементы списка urlpatterns
в urls.py
) будет уже сложновато: нам придётся вручную собирать список правил из отдельных кусочков.
Однако Django на то и фреймворк, чтобы нам не приходилось придумывать свои способы управления сложностью. В Django уже есть готовый паттерн: приложения (applications).
Каждое приложение представляет из себя пакет с модулями, включающий в себя модуль описания моделей (о них расскажет один из последующих уроков) и вьюх, а также часто имеет свои шаблоны и свои же urlpatterns. Приложения часто выглядят как миниатюрные, но самостоятельные Web-приложения (отсюда и название). Именно эта самостоятельность помогает реализовывать переиспользуемые приложения, решающие типовые задачи. Сам фреймворк Django предоставляет приличный набор таких вот приложений-кирпичиков, помогающих быстро заложить фундамент проекта.
На самом деле у нас уже есть одно! Это тот самый пакет hello_django
. Самый первый пакет, который вы создаёте, запуская django-admin startproject
, может и не быть приложением сам по себе. Его задача, по сути, заключается в описании точки входа в Web-приложение: в этом пакете задаются настройки всего приложения и корневые urlpatterns.
Именно приложением в терминологии Django пакет hello_django
мы сделали, когда добавили его в settings.INSTALLED_APPS
.
Этот список содержит перечень всех Django applications, подключенных к текущему проекту. Многие механизмы фреймворка обращаются к этому перечню во время своей работы. Так встроенный загрузчик шаблонов (Template Loader) ищет их в поддиректориях с именем "templates" во всех подключенных приложениях. Именно для этого мы подключили hello_django
в роли приложения — чтобы загрузчик шаблонов нашёл наш первый шаблон!
Но давайте же создадим, наконец, новое приложение! Для этого вам нужно будет перейти в директорию пакета hello_django
и выполнить django-admin startapp calc
. В результате будет создано приложение следующего вида (вид с точки зрения корня проекта):
tree hello_django/calc
hello_django/calc
├── 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
. Для этого, в качестве имени, мы указываем полный путь к приложению:
# hello_django/calc/apps.py
class CalcConfig(AppConfig):
...
name = 'hello_django.calc' # <- изменяем эту строчку
и добавляем имя приложения в список:
# hello_django/settings.py
INSTALLED_APPS = [
...
'hello_django',
'hello_django.calc', # <- добавляем эту строчку
]
Всё, приложение создано и подключено!
По-умолчанию в приложении не генерируется модуль urls.py
, потому что приложение может и не быть настолько большим, чтобы потребовался отдельный набор правил маршрутизации. Такие небольшие приложения "прописывают" в urls.py
уровнем выше. Но мы будем делать "большое" приложение, поэтому смело создавайте файл hello_django/calc/urls.py
следующего вида:
from django.urls import path
from hello_django.calc import views
urlpatterns = [
path('', views.index),
]
Да, пока всё максимально похоже на корневой
urls.py
: мы опять связали пустой путь с вьюхойviews.index
, но уже из этого приложения.
Теперь нужно связать urlpatterns приложения с urlpatterns проекта. Модифицируем hello_django/urls.py
:
from django.urls import path, include # <- добавлен include
from hello_django import views
urlpatterns = [
path('', views.index),
path('calc/', include('hello_django.calc.urls')), # <- новая строчка
# path('admin/', admin.site.urls),
]
С этого момента все пути, начинающиеся с "calc/", будут перенаправляться в hello_django.calc.urls
. В приложении у нас уже приписана view index
, связанная с путём ''
, что означает: запрос по пути calc/
без каких либо продолжений будет направлен в hello_django.calc.views.index
.
Только что мы произвели встраивание приложения в проект по префиксу пути: переиспользуемые приложения обычно встраиваются именно таким образом. Как вы, возможно, заметили, префикс calc/
задаётся вне встраиваемого приложения, поэтому приложение может быть встроено в любой проект по любому префиксу. И правила маршрутизации этого приложения не будут конфликтовать с правилами проекта и других приложений!
View у нас прописана в правилах маршрутизации. Реализуем её:
# hello_django/calc/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse('calc')
Если теперь открыть в браузере адрес localhost:8000/calc/
, то вы увидите текст "calc".
Здесь view возвращает HttpResponse
с указанным телом ответа, вместо того чтобы использовать шаблон. В модуле django.http вы найдёте JsonResponse
, позволяющий возвращать данные в виде JSON и FileResponse
, нужный для отправки клиенту файлов.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт