Python: Разработка на фреймворке Django
Теория: Представления (Views)
Представления или views — главные составляющие веб-приложений на основе Django. Еще их называют джангистами или вьюхами. Приложение может не взаимодействовать с базой данных, может не использовать шаблоны, но views в нем будут обязательно — приложение должно как-то отвечать на запросы.
В Django используются два вида представлений:
- Представления-функции — view functions
- Представления-классы — class based views
В одном проекте могут одновременно использоваться оба вида. И нельзя сказать, что один вид лучше другого по всем признакам. У обоих есть свои сильные и слабые стороны. В этом уроке разберем их подробнее.
Представления-функции
Представления-функции — простой, но мощный вид представлений. Это обычные функции, которые принимают на входе запрос — объект класса HttpRequest, и возвращают ответ — объект класса HttpResponse или ему подобных.
Так как каждая функция представления получает полную информацию о запросе, ей одной решать, как этот запрос обрабатывать. Например, функция решает, как реагировать на методы HTTP и как обрабатывать параметры запроса:
Если представление — это обычная функция, к ней можно применять обычные декораторы. В Django есть несколько полезных. Вот один из них:
Если такая view получит запрос с отличным от указанных методом, то автоматически будет сформирован ответ MethodNotAllowed (код 405).
View function просты концептуально и дают нам полный контроль над обработкой запроса. Это полезно, но заставляет каждый раз писать код вручную или подготавливать библиотеку декораторов, которые упрощают решение типичных задач.
Представления-классы
Все представления этого вида наследуются от класса django.views.View. Так выглядит код в простейшем случае:
Метод get здесь работает как view function. При этом на каждый запрос будет создан новый экземпляр этого класса. Поэтому мы смело можем объявлять в классе методы, которые по ходу выполнения запроса будут менять его состояние.
Регистрируется представление-класс с помощью метода класса as_view. Выглядит регистрация так:
Представления-классы хороши тем, что дают возможность легко переиспользовать поведение через наследование. Посмотрим на встроенный TemplateView из модуля django.views.generic.base в деле:
Нам даже не пришлось наследовать класс. Мы просто использовали готовый — указали при регистрации имя шаблона. Но даже если бы мы унаследовали класс, чтобы передать шаблону данные, то нам бы пришлось переопределить лишь малую часть функциональности класса-предка:
Подобных базовых представлений Django содержит предостаточно. Также хорошо проработаны представления для отображения сущностей из базы данных: отображение списков записей, отображение отдельных записей в детализированной форме. Сказывается направленность Django на решение задач по разработке контентных сайтов.
Представления-классы хорошо подходят для решения повторяющихся задач, так как большая часть из них уже почти решена силами Django.


