Джанго: "проекти" проти "програми"


202

У мене є досить складний «продукт», який я готую будувати за допомогою Django. Я збираюся уникати використання термінів "проект" та "додаток" у цьому контексті, оскільки мені не зрозуміло їх конкретний зміст у Django.

Проекти можуть мати багато додатків. Додатки можна ділитися між багатьма проектами. Чудово.

Я не вигадую блог чи форум - я не бачу, щоб будь-яка частина мого продукту була повторно використаною в будь-якому контексті. Інтуїтивно я назвав би це "додатком". Тоді я роблю всю свою роботу в одній папці "app"?

Якщо так ... з точки зору project.appпростору імен Django , моя схильність використовувати myproduct.myproduct, але, звичайно, це заборонено (але додаток, який я будую, - це мій проект, а мій проект - додаток!). Тому я вважаю, що, можливо, я повинен наблизитися до Django, створивши одну програму для "значної" моделі, але я не знаю, де намалювати межі в моїй схемі, щоб розділити її на додатки - у мене дуже багато моделей з відносно складними відносинами.

Я сподіваюся, що для цього є спільне рішення ...


1
Документи пояснюють різницю між "додатком" та "проектом" тут: docs.djangoproject.com/en/dev/ref/applications/…
guettli

Відповіді:


56

Що зупинити вас на використанні 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т.д. - всі речі , які ви могли б хотіти імпорт.

Аналогічно, якщо ви можете створити щось на зразок блогу у форматі, який є досить загальним упродовж встановлень, ви можете обгорнути його у програмі зі своїм шаблоном, папкою зі статичним вмістом тощо та налаштувати примірник проекту django, щоб використовувати це вміст програми.

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

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

  • Налаштування Django за замовчуванням не робить цього.
  • Часто я хочу створити основний додаток, тому я створюю його, як правило, називається website. Однак пізніше я, можливо, захочу розробити оригінальну функціональність саме для цього сайту. З метою зробити його знімним (чи ні колись я це роблю), я схильний створювати окремий каталог. Це також означає, що я можу відмовитись від зазначеної функціональності, лише від’єднавши цей пакет із конфігурації та видаливши папку, а не складне видалення правильних URL-адрес із глобальної папки urls.py.
  • Дуже часто, навіть коли я хочу зробити щось незалежне, йому потрібно десь жити, поки я доглядаю за ним / роблю його незалежним. В основному це випадок, але для речей я маю намір зробити загальний характер.
  • Моя папка верхнього рівня часто містить кілька інших речей, включаючи, але не обмежуючись ними, сценарії wsgi, сценарії sql тощо.
  • Розширення управління django покладаються на підкаталоги. Тому має сенс назвати пакунки належним чином.

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


24
+1 ... "Що не дозволяє використовувати myproduct.myproduct?" - Команда Джанго "startapp" насправді зупиняє вас, я припускаю, як умову. Мені подобаються конвенції, особливо в контексті командних зусиль, але я вважаю за краще розуміти логіку, що стоїть за ними :)
Dolph

@ Дольф ах, чи не так? Я не використовував його з першого разу, оскільки я маю власну команду для створення проекту, який спочатку створює моделі, а потім автоматично генерує CRUD-матеріали для цих моделей. Все-таки так, конвенції хороші. Я дотримуюся конвенцій про джанго хоча б тому, що багато в чому вони мають сенс.

1
Додам, що використання одного і того ж імені для проекту та програми в ньому також спричиняє проблеми з тим manage.py, що він не може правильно імпортувати налаштування вашого проекту. Це сталося зі мною, і я вирішив це, переробляючи додаток на ефект myproduct_app.
BHSPitMonkey

89

Після того, як ви закінчите використання startprojectта startapp, ніщо не заважатиме вам поєднувати "проект" та "додаток" в одному пакеті Python. Проект насправді є не що інше, як settingsмодуль, а додаток насправді не що інше, як modelsмодуль - все інше не є обов'язковим.

Для невеликих сайтів цілком розумно мати щось на кшталт:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py

18
+1 Підсумок: проект має settings.py, додаток має models.py. Вони однакові за рівнем структури. Раніше я думав, що проект на один рівень вище, ніж додаток, гадаю, я помилявся
Philip007

2
@claymation, що потрібно включити в налаштування (як додаток), щоб дозволити "python management.py makemigrations" або "python Manag.py migrate" побачити файл "models.py" у каталозі "мій продукт"?
жовтня

1
@mlwn Я усвідомлюю, що я дуже пізно відповідаю на це, але я сам в подібній ситуації, і я шукав багато відповідей. Щоб відповісти на ваше запитання, все, що вам потрібно зробити, це включити ваш проект у INSTALLED_APPSсписок. Ось приклад: stackoverflow.com/a/59739912/399435
Karthic Raghupathi

@KarthicRaghupathi, спасибі .. :) приємно бачити коментарі, відповіді через чотири роки .. ура
примхнули

69

Спробуйте відповісти на запитання: "Що робить моя заява?". Якщо ви не можете відповісти в одному реченні, можливо, ви можете розділити його на кілька додатків з більш чистою логікою.

Я читав цю думку десь незабаром після того, як я почав працювати з джанго і виявляю, що я задаю собі це питання досить часто, і це мені допомагає.

Ваші програми не повинні бути багаторазовими, вони можуть залежати один від одного, але вони повинні робити одне.


8
Я все ще трохи борюся, коли йдеться про викладку власного додатка. Я відчуваю, що моє основне додаток трохи важке, але в той же час я не зміг би переробити його в щось подібне до того, що нагадувало б щось вільно з'єднане. Я схиляюся до думки, що насправді не буде поліпшенням, якщо мої основні основні сутності будуть відокремлені, якщо вони все ще сильно залежать одне від одного, і немає необхідності повторно використовувати або узагальнювати на горизонті. Я схиляюся до "не передчасно рефактор" як інтерпретація "не передчасно оптимізуй"
acjay

15

Я знайшов наступні повідомлення в блозі дуже корисними щодо програм та проектів django:

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


8

Якщо так ... з точки зору простору імен Django's project.app, моя схильність полягає у використанніmyproduct.myproduct, але, звичайно, це не дозволено

Нічого подібного не дозволяється. Це ваш проект, ніхто вас не обмежує. Доцільно зберегти розумне ім’я.

Я не бачу, щоб будь-яка частина мого продукту була повторно використана в будь-якому контексті. Інтуїтивно я назвав би це "додатком". Тоді я роблю всю свою роботу в одній папці "app"?

У загальному проекті django є багато додатків (contrib apps), які реально використовуються у кожному проекті.

Скажімо, що ваш проект виконує лише одне завдання і має лише одне додаток (я називаю це тим, mainяк проект обертається навколо нього і навряд чи підключається). Цей проект також як і раніше використовує деякі інші програми.

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

  • Існує багато інших речей, які код, окрім програми, обробляє у проекті (базові статичні файли, базові шаблони, налаштування .... тобто забезпечує базу).
  • У загальному підході project.app django автоматично визначає схему sql від моделей.
  • Ваш проект було б набагато простіше побудувати за допомогою звичайного підходу.
  • Ви можете визначити кілька імен для URL-адрес, переглядів та інших файлів за своїм бажанням, але я не бачу в цьому потреби.
  • Можливо, вам доведеться в майбутньому додати кілька додатків, що було б дуже просто за допомогою звичайних проектів джанго, інакше це може стати однаково або складніше і нудно зробити.

Що стосується більшої частини роботи над програмою, я думаю, що це стосується більшості проектів джанго.


1
+1, esp для mainконвенції - це має багато сенсу для оригінального такого проекту. Я планую додавати додатки для багаторазового використання пізніше, але зараз це поза моїм фокусом.
Дельф

2

Тут творці Джанго самі вказують на цю різницю . Я думаю, що думати про програми, як вони повинні бути повторно використані в інших проектах, це добре . Також хороший спосіб роздумувати про додатки в Django - це сучасні веб-програми.

Уявіть, що ви створюєте великі динамічні веб-програми, що базуються на JavaScript .

Потім ви можете створити в додатку django з назвою, наприклад, "FrontEnd" <- у тонкому додатку ви покажете вміст.

Потім ви створюєте кілька додатків програми. Наприклад, додаток під назвою "Коментарі", який зберігатиме коментарі користувачів. І додаток "Коментарі" нічого не відображатиме. Це буде лише API для запитів AJAX вашого динамічного веб-сайту JS .

Таким чином, ви завжди можете повторно використовувати додаток "Коментарі". Ви можете зробити його з відкритим кодом без відкриття джерела всього проекту. І ви дотримуєтесь чистої логіки свого проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.