Архитектура В Проектах Django – Как Выжить

Думаю, ни для кого не секрет, что в разговорах опытных Python-разработчиков, да и не только, часто проскакивают фразы о том, что Django — зло, что у Django плохая архитектура и на нем невозможно без боли написать большой проект. Даже средний проект Django зачастую сложно поддерживать и расширять.

Предлагаю разобраться, почему так происходит и что не так с Django-проектами.



Немного теории

Когда мы начинаем изучать Django без опыта работы с другими языками и фреймворками, помимо документации мы читаем туториалы, статьи, книги и почти в каждой видим что-то вроде этого:
Django — это платформа, использующая шаблон проектирования Модель-Представление-Контроллер (MVC).

А еще есть куча неточных диаграмм и пояснений о том, что такое MVC. Почему они неточны и что с ними не так, вы можете увидеть Здесь или Здесь .

Обычно в таких схемах MVC описывается так:

  • Модель - доступ к хранилищу данных
  • Представление — это интерфейс, с которым взаимодействует пользователь.

  • Контроллер — это своего рода связующий объект между моделью и представлением.

Эти общие конструкции становятся запутанными и мешающими только тогда, когда вы хотите написать приложение, имеющее бизнес-логику.

Стоит обратить внимание на две вещи.

Во-первых, M в MVC часто означает модель данных, и говорят, что это некий класс, который отвечает за предоставление доступа к базе данных.

Что неверно и не соответствует классическому MVC и его потомкам MV*.

В классическом MVC M означает модель предметной области — объектная модель предметной области, объединяющая данные и поведение.

Точнее, M в MVC — это интерфейс к модели предметной области, поскольку модель предметной области — это слой объектов, описывающий различные аспекты определенной области бизнеса.

Где одни объекты предназначены для моделирования элементов данных, которые работают в этой области, а другие должны формализовать определенные бизнес-правила.

Во-вторых, в Django нет выделенного слоя контроллера, и когда вам говорят, что в Django слой представлений является контроллером, не верьте этим людям.

Обратитесь к официальной документации, а точнее к Часто задаваемые вопросы , то вы можете видеть, что этот слой соответствует принципам уровня представления в MVC, особенно если мы рассматриваем DRF, а слоя контроллера как такового в Django нет. Как указано в FAQ, если вам действительно нужны аббревиатуры, вы можете использовать аббревиатуру MTV (модель, шаблон и представление) в контексте Django. Если вы действительно хотите рассмотреть Web MVC и сравнить Django с другими фреймворками, то для простоты вы можете считать его контроллером представления.

Несмотря на то, что Django не соответствует аббревиатуре MVC, он реализует основную идею MVC — отделение бизнес-логики от логики представления данных.

Но на практике это не всегда так по ряду причин, о которых мы поговорим ниже.



Перейдем к практике

Выделим несколько слоев в приложениях Django, которые есть в каждом туториале и практически в каждом проекте:
  • интерфейс/шаблоны
  • сериализаторы/формы
  • Просмотры
  • модели
Мы не будем подробно рассматривать каждый слой; все это можно найти в документации.

В основном мы будем рассматривать Django с использованием DRF. Попробуем на двух простых примерах проанализировать, что должно быть размещено в каждом слое и какую ответственность несет каждый слой.

Первый случай — создание заказа.

При создании заказа нам необходимо:

  • проверить актуальность заказа и наличие товара
  • создать заказ
  • резервировать товар на складе
  • отправьте заявку менеджеру
  • уведомить пользователя о том, что его заказ обработан
Второй случай — просмотр списка моих заказов.

Здесь все просто, нам нужно показать пользователю список его заказов:

  • получить список заказов пользователей


Уровень сериализаторов/форм

Слой сериализаторов имеет три основные функции (все выводы для сериализаторов справедливы и для форм):
  • проверить данные
  • преобразовать данные запроса в типы данных Python
  • конвертировать сложные объекты Python в простые типы данных Python (например, модели Django в dict)
Кроме того, сериализаторы имеют два метода: create и update, которые вызываются в методе save() и почти всегда используются в представлении.

Пример использования из документации:

   

class CommentSerializer(serializers.Serializer):

Теги: #python #архитектура #django
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.