Я только начал изучать Django / Python / Web Development. Эта проблема беспокоила меня уже некоторое время.
Я создаю приложение с несколькими шаблонами в Django. У меня есть файл views.py, который в основном просто отображает ответы на соответствующие шаблоны, и у меня есть файл models.py, в котором я структурировал свою БД. В одном из моих шаблонов мне нужно загрузить изображение (что я могу сделать), и мне нужно запустить логику, основанную на функциях загруженного изображения (еще не сделано). Эта логика включает в себя много тяжелых вычислений. После выполнения вычислений логика должна вернуть некоторую обработанную информацию (координаты) в шаблон.
Я смог успешно выполнить все эти действия в автономном приложении для настольного компьютера Python, вызывающем файлы Python один за другим. Однако, поскольку теперь я хочу сделать это веб-приложением, я начал использовать фреймворк Django.
Я много занимался поиском, но до сих пор не могу понять, где именно я должен разместить этот файл Python, содержащий всю логику. Должен ли я иметь другой файл на основе классов (logic.py)
и вызвать его из view.py
? Я погуглил и обнаружил, что многие разработчики помещают свою бизнес-логику в свои models.py в Django. Тем не менее, я чувствую, что это интуитивно неправильно, поскольку модель должна общаться исключительно с бэкэндом Любая помощь будет оценена. Спасибо заранее.
Ответы:
Есть несколько вариантов, в зависимости от ваших требований:
Добавьте логику, например, к
Image
модели. Это полезная опция, если вам нужно хранить метаданные для каждого изображения в базе данных, и каждый экземпляр модели (каждое изображение) обрабатывается сам по себе.Добавьте логику как простой
Image
класс Python , например, в файле с именемimage.py
. Ничто в Django не ограничивает вас от добавления логики, кроме как в модуляхviews
илиmodels
. Это хороший вариант, если логика изображения является центральным компонентом вашего приложения Django (например, приложения обработки изображений).Создайте отдельный проект Python, который предоставляет логику, а затем вызовите его из ваших представлений. Убедитесь, что этот проект установлен в среде Python вашего приложения Django. Этот параметр действителен, если целью вашего приложения Django является загрузка и просмотр изображений или отображение результатов обработки изображений в прямом ответе на запрос пользователя, но в тех случаях, когда обработка изображений может использоваться и другими проектами.
Создайте отдельное приложение, которое обрабатывает запросы асинхронно и запускается отдельно от вашего приложения Django. Эта опция полезна, если вам необходимо отделить обработку изображений от цикла запроса приложения, обработать большое количество изображений или если каждый расчет занимает слишком много времени для решения в течение времени цикла запроса (скажем, в пределах не более 500 мс до 1 с) ,
В Django нет ничего, что требовало бы модели для взаимодействия с серверной частью, а точнее с базой данных. Я думаю, что вы смешиваете семантику того, что Django обычно рассматривает как модель (а именно абстракцию одной или нескольких таблиц в базе данных), и термин модель как конструктивная конструкция (например, как в доменно-управляемом дизайне).
источник
Даниэль Гринфельд, соавтор книги «Два совка Django», рекомендует, чтобы бизнес-логика должна быть в моделях », когда это возможно, или в формах, если необходимо. Что касается возможного дубликата Барта, django может быть похож на MVC, но это не MVC. Как объясняется здесь в официальной документации по django faq. @adrita, я думаю, что вам, возможно, потребуется изучить официальную документацию, чтобы немного лучше понять концепцию моделей, представлений и шаблонов.
источник
В официальных документах Django https://docs.djangoproject.com/en/1.11/ говорится:
Джанго рекомендует, чтобы логика содержалась в представлениях.
источник
Model.clean()
) подразумевается немного более явно, что (если мы просто реализуем проект Django для моделей, шаблонов и представлений) - бизнес-логика (или, по крайней мере, проверка) принадлежит модельный слой. Обратите внимание, что я не включил формы в это упрощение, которые также являются приемлемыми.