Зарегистрируйтесь, чтобы продолжить обучение

Приложения Python: Разработка на фреймворке Django

Любой веб-проект достаточно быстро перестает помещаться в рамках одного пакета: становится слишком много 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. Он нужен для отправки клиенту файлов.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»