Приложения

Приложения

Любой 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 нам пригодится!

Для окончания создания "болванки" приложения нам остаётся его подключить в settings.INSTALLED_APPS, для чего мы дописываем имя приложения в список:

# 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

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, нужный для отправки клиенту файлов.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →