Джанго: "проекты" против "приложений" - PullRequest
189 голосов
/ 02 февраля 2011

У меня довольно сложный «продукт», который я собираюсь собрать, используя Django. Я собираюсь избегать использования терминов «проект» и «приложение» в этом контексте, потому что мне не ясно их конкретное значение в Django.

Проекты могут иметь много приложений. Приложения могут быть использованы многими проектами. Хорошо.

Я не заново изобретаю блог или форум - я не вижу, чтобы какая-то часть моего продукта могла быть повторно использована ни в каком контексте. Интуитивно я бы назвал это «приложение». Затем я делаю всю свою работу в одной папке «приложения»?

Если это так ... с точки зрения пространства имен project.app Джанго, я склонен использовать myproduct.myproduct, но, конечно, это не разрешено (но приложение, которое я создаю, является моим проект, а мой проект это приложение!). Поэтому я склонен полагать, что, возможно, я должен подходить к Django, создавая одно приложение для «значимой» модели, но я не знаю, где провести границы в моей схеме, чтобы разделить ее на приложения - у меня много моделей с относительно сложными отношениями.

Я надеюсь, что есть общее решение для этого ...

Ответы [ 6 ]

88 голосов
/ 15 марта 2013

Как только вы закончите использовать startproject и startapp, ничто не помешает вам объединить «проект» и «приложение» в одном пакете Python.Проект на самом деле является не чем иным, как settings модулем, а приложение на самом деле является не чем иным, как models модулем - все остальное необязательно.

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py
68 голосов
/ 02 февраля 2011

Попробуйте ответить на вопрос: «Что делает мое приложение?».Если вы не можете ответить одним предложением, возможно, вы можете разделить его на несколько приложений с более чистой логикой.

Я прочитал эту мысль где-то вскоре после того, как начал работать с django, и обнаружил, чтоЯ часто задаю себе этот вопрос, и он мне помогает.

Ваши приложения не нужно многократно использовать, они могут зависеть друг от друга, но они должны делать одно.

56 голосов
/ 02 февраля 2011

Что мешает вам использовать myproduct.myproduct?То, что вам нужно для этого, примерно состоит в следующем:

django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py

и так далее.Поможет ли мне, если я скажу, что views.py не нужно называть views.py?При условии, что вы можете назвать в пути python функцию (обычно package.package.views.function_name), которую он будет обрабатывать.Просто как тот.Все эти "проекты" / "приложения" это просто пакеты Python.

Теперь, как вы должны это сделать?Или, скорее, как я могу это сделать?Что ж, если вы создадите значительную часть функциональности многократного использования, как, например, редактор разметки, тогда вы создадите «приложение верхнего уровня», которое может содержать widgets.py, fields.py, context_processors.py и т. Д. - все, что вам может понадобитьсяimport.

Точно так же, если вы можете создать что-то вроде блога в формате, который является довольно общим для установок, вы можете обернуть его в приложении, с его собственным шаблоном, папкой статического содержимого и т. д., и настроитьэкземпляр проекта django для использования содержимого этого приложения.

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

Однако для решения вашей реальной проблемы, даничто не говорит о том, что вы не можете работать с папкой проекта верхнего уровня. Это то, что приложения делают , и вы можете сделать это, если вы действительно этого хотите.Однако я склонен этого не делать по нескольким причинам:

  • Настройки по умолчанию в Django этого не делают.
  • Часто я хочу создать основное приложение, поэтому я создаю его,обычно называется website.Однако позже я мог бы захотеть разработать оригинальную функциональность только для этого сайта.Чтобы сделать его съемным (независимо от того, делаю я это или нет), я обычно создаю отдельный каталог.Это также означает, что я могу отказаться от упомянутой функциональности, просто отсоединив этот пакет от конфигурации и удалив папку, а не сложное удаление нужных URL-адресов из глобальной папки urls.py.
  • Очень часто, даже когда я хочучтобы сделать что-то независимое, ему нужно где-то жить, пока я присматриваю за ним / делаю это независимым.По сути, это вышеупомянутый случай, но для вещей, которые я собираюсь сделать универсальными.
  • Моя папка верхнего уровня часто содержит несколько других вещей, включая, помимо прочего, сценарии wsgi, сценарии sql и т. Д.
  • расширения управления django основаны на подкаталогах.Поэтому имеет смысл называть пакеты соответствующим образом.

Короче говоря, причина, по которой существует соглашение, такая же, как и у любого другого соглашения - это помогает, когда речь идет о других, работающих с вашим проектом.Если я увижу fields.py, я сразу же ожидаю, что код в нем будет подклассом поля django, тогда как, если я увижу inputtypes.py, я, возможно, не пойму, что это значит, не глядя на него.

15 голосов
/ 02 февраля 2011

Я нашел следующие сообщения в блоге очень полезными о приложениях и проектах django:

В принципе, у вас есть большая свобода в организации django для организации исходного кода вашего продукта.

8 голосов
/ 03 февраля 2011

Если это так ... с точки зрения пространства имен Django project.app, я склонен использовать myproduct.myproduct, но, конечно, это не разрешено

Ничего подобного не допускается. Это ваш проект, никто не ограничивает вас. Желательно сохранить разумное имя.

Я не вижу никакой части моего продукта, пригодной для повторного использования в каком-либо контексте. Интуитивно я бы назвал это «приложение». Затем я делаю всю свою работу в одной папке "приложения"?

В общем проекте django есть много приложений (contrib-приложений), которые действительно используются в каждом проекте.

Допустим, ваш проект выполняет только одну задачу и имеет только одно приложение (я называю его main, поскольку проект вращается вокруг него и вряд ли может быть подключен). Этот проект также все еще использует некоторые другие приложения вообще.

Теперь, если вы скажете, что в вашем проекте используется только одно приложение (INSTALLED_APPS='myproduct'), так что зачем использовать project, определяя проект как project.app, я думаю, вам следует рассмотреть некоторые моменты:

  • Существует много других вещей, которые обрабатывает код, отличный от приложения в проекте (базовые статические файлы, базовые шаблоны, настройки ... т.е. обеспечивает базу).
  • В общем подходе project.app django автоматически определяет схему sql из моделей.
  • Ваш проект будет гораздо проще построить с помощью обычного подхода.
  • Вы можете определить несколько разных имен для URL, представлений и других файлов, как хотите, но я не вижу необходимости.
  • Возможно, вам понадобится добавить некоторые приложения в будущем, что было бы очень легко с обычными проектами django, в противном случае это может стать одинаково или более трудным и утомительным.

Что касается большей части работы, выполняемой в приложении, я думаю, что это относится к большинству проектов django.

1 голос
/ 05 декабря 2017

Здесь создатели Django сами указывают на эту разницу .Я думаю, что думать о приложениях, поскольку они должны быть многоразовыми в других проектах, - хорошо .Также хорошим представлением о приложениях в Django предоставляют современные веб-приложения.

Представьте, что вы создаете большое динамическое веб-приложение на основе JavaScript .

Затем вы можете создать приложение в django с именем, например, «FrontEnd» <- в приложении thins вы будете отображать контент. </p>

Затем вы создадите несколько внутренних приложений.Например, приложение под названием «Комментарии», в котором будут храниться комментарии пользователей.А приложение «Комментарии» само по себе ничего не отображает.Это будет просто API для запросов AJAX вашего динамического JS веб-сайта .

Таким образом, вы всегда можете повторно использовать приложение «Комментарии»,Вы можете сделать его открытым исходным кодом, не открывая исходный код всего проекта.И вы держите в чистоте логика вашего проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...