Где в коде разместить код обработки данных?

Делаю веб-приложение на Python с использованием Flask, SQLAlchemy и WTForms.
Стоит задача получить от пользователя некоторое значение, обработать его и сохранить в БД.
Как я делаю - при вводе значения в форме оно проверяется на возможность ввода в зависимости от уже имеющихся значений в БД, затем, функция в Виде (Вид как в MVC) немного модифицирует значение в зависимости от некоторых внешних условий и сохраняет в БД. В модели таблицы БД прописана функция, которая в зависимости от уже находящихся данных изменяет сохраняемое значение и оно сохраняется в БД.
Как правильно организовать этот процесс? Чтоб получилось понятно, безопасно и легко поддерживаемо.

Есть такая мысль - На уровне формы при вводе данных выполнять все необходимые проверки, чтоб значение уже изначально вводилось нужное. В Виде сохранять в БД, а из модели убрать все дополнительные методы.
  • Вопрос задан
  • 314 просмотров
Пригласить эксперта
Ответы на вопрос 2
@thenno
Проектирую, разрабатываю, преподаю.
У Вас сейчас какая-то каша. Вообще, существует два подхода: толстые модели или толстые контроллеры, лучше продолжить гуглить на эту тему.

Если вкрадце: толстые модели означают, что вся бизнес-логика зашита в модель (модель, вообще говоря, далеко не равна отображению в базе данных), толстые контроллеры - бизнес-логика в контроллерах. В лучших домах Англии принято использовать архитектуру с толстыми моделями из-за более гибкого подхода, а уж тащить какую-то бизнес-логику в представление вообще считается диким моветоном. Да и это логично, если учитывать что модели - это отображение предметной области в объектную модель.

Если еще короче - правильнее всего перенести всю бизнес-логику и валидацию в модель.
Ответ написан
@REDkiy Автор вопроса
Устал читать на эту тему. Пришёл для себя к такому выводу:
Модель:
- Описываю таблицу в нотации SQLAlchemy в виде класса.
- Делаю статический метод с помощью декоратора @staticmethod, в нём делаю некую логику для получения данных из этой таблицы, передаю некие параметры и соответственно им выдаю результат.
- С помощью декоратора @property и последующего декоратора @bla-bla.setter делаю метод который модифицирует состояние значений класса с учётом уже существующих данных в БД, а также имеет возможность изменения пересекающихся данных уже имеющихся в БД, и сохраняет новую запись.

Контроллер:
- Получает данные из БД с использованием статического метода модели, подставляет их в Представление (название Вид мне разонравилось) и отправляет его пользователю.
- После ввода или изменения данных пользователем в Представлении, получает их и создаёт или изменяет с помощью метода @bla-bla.setter модели.

Представление:
- Отображает и позволяет ввод данных пользователем.
- Проводит валидацию данных перед отправкой контроллеру. Например проверяет правильность ввода e-mail. И возможность установки какого-то значения в определённых диапазонах с учётом уже существующих в БД.

Вопрос вот в чём, так нормально? Или стоит сделать проверку с помощью @staticmethod возможности установки значения в самой модели и в представлении просто получать True с его помощью если проходит и соответственно выдавать сообщение пользователю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы