webapp - python start django server




Django: "Projekte" vs "Apps" (4)

Versuchen Sie die Frage zu beantworten: "Was macht meine Bewerbung?". Wenn Sie nicht in einem einzigen Satz antworten können, können Sie ihn vielleicht in mehrere Apps mit saubererer Logik aufteilen.

Ich habe diesen Gedanken gelesen, kurz nachdem ich angefangen habe, mit Django zu arbeiten, und ich stelle fest, dass ich diese Frage oft an mich stelle und das hilft mir.

Ihre Apps müssen nicht wiederverwendbar sein, sie können aufeinander angewiesen sein, aber sie sollten eines tun.

Ich habe ein ziemlich komplexes "Produkt", das ich mit Django bauen werde. Ich werde es vermeiden, in diesem Zusammenhang die Begriffe "Projekt" und "Anwendung" zu verwenden, weil mir ihre spezifische Bedeutung in Django nicht klar ist.

Projekte können viele Apps haben. Apps können unter vielen Projekten geteilt werden. Fein.

Ich erfinde den Blog oder das Forum nicht neu - ich sehe keinen Teil meines Produkts in irgendeinem Kontext wiederverwendbar. Intuitiv würde ich dies eine "Anwendung" nennen. Mache ich dann meine ganze Arbeit in einem einzigen "App" -Ordner?

Wenn dem so ist ... in Bezug auf Djangos Namespace project.app myproduct.myproduct ich myproduct.myproduct , aber das ist natürlich nicht erlaubt (aber die Anwendung, die ich erstelle, ist mein Projekt und mein Projekt ist eine Anwendung! ). Ich bin daher der Meinung, dass ich vielleicht Django angehen sollte, indem ich eine App pro "signifikantes" Modell erstelle, aber ich weiß nicht, wo ich die Grenzen in meinem Schema aufteilen soll, um es in Apps zu trennen - ich habe viel von Modellen mit relativ komplexen Beziehungen.

Ich hoffe, dass es eine gemeinsame Lösung dafür gibt ...


Wenn dem so ist ... in Bezug auf Djangos Namespace project.app ist es meine Neigung, meinProdukt.mein Produkt zu verwenden, aber das ist natürlich nicht erlaubt

Es gibt nichts wie nicht erlaubt. Es ist dein Projekt, niemand schränkt dich ein. Es ist ratsam, einen angemessenen Namen zu behalten.

Ich sehe keinen Teil meines Produkts in irgendeinem Kontext wiederverwendbar. Intuitiv würde ich dies eine "Anwendung" nennen. Mache ich dann meine ganze Arbeit in einem einzigen "App" -Ordner?

In einem allgemeinen Django-Projekt gibt es viele Apps (Contrib-Apps), die wirklich in jedem Projekt verwendet werden.

Lassen Sie uns sagen, dass Ihr Projekt nur eine Aufgabe erledigt und nur eine einzige App hat (ich nenne es main , weil das Projekt sich darum dreht und kaum steckbar ist). Auch dieses Projekt verwendet im Allgemeinen noch einige andere Apps.

Wenn Sie nun sagen, dass Ihr Projekt nur die eine App verwendet ( INSTALLED_APPS='myproduct' ), also was ist die Verwendung des project , das das Projekt als project.app , sollten Sie einige Punkte beachten:

  • Es gibt viele andere Dinge, die der Code anders als die App in einem Projekt behandelt (Basis statische Dateien, Basis-Vorlagen, Einstellungen .... dh bietet die Basis).
  • Im allgemeinen project.app-Ansatz definiert django automatisch das SQL-Schema von Modellen.
  • Ihr Projekt wäre viel einfacher mit dem konventionellen Ansatz gebaut werden.
  • Sie können verschiedene Namen für URLs, Ansichten und andere Dateien definieren, wie Sie möchten, aber ich sehe keine Notwendigkeit.
  • Möglicherweise müssen Sie in Zukunft einige Anwendungen hinzufügen, die mit den herkömmlichen Djangoprojekten sehr einfach wären, die sonst genauso oder schwieriger und langwieriger werden könnten.

Was die meisten Arbeiten in der App betrifft, denke ich, dass dies bei den meisten Django-Projekten der Fall ist.


Sobald du startproject und startapp startproject startapp , hält dich nichts davon ab, ein "Projekt" und eine "App" in demselben Python-Paket zu kombinieren. Ein Projekt ist eigentlich nichts anderes als ein settings , und eine App ist wirklich nichts weiter als ein Modellmodul - alles andere ist optional.

Für kleine Websites ist es durchaus sinnvoll, Folgendes zu haben:

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

Was hält Sie davon ab, myproduct.myproduct ? Was Sie dazu benötigen, besteht grob gesagt darin:

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

und so weiter. Würde es helfen, wenn ich views.py dass views.py nicht als views.py bezeichnet werden views.py ? Vorausgesetzt, Sie können im Python-Pfad eine Funktion (normalerweise package.package.views.function_name) benennen, wird diese behandelt. So einfach ist das. All diese "Projekt" / "App" Zeug ist nur Python-Pakete.

Nun, wie soll das gemacht werden? Oder, wie könnte ich es tun? Nun, wenn Sie eine signifikante wiederverwendbare Funktionalität erstellen, wie zB einen Markup-Editor, dann erstellen Sie eine "Top-Level-App", die widgets.py , fields.py , context_processors.py usw. enthält - alles, was Sie möchten einführen.

Ähnliches gilt, wenn Sie etwas wie ein Blog in einem Format erstellen können, das bei Installationen generell ziemlich generisch ist, können Sie es in einer App mit einer eigenen Vorlage, einem statischen Inhaltsordner usw. einbinden und eine Instanz eines Django-Projekts konfigurieren App-Inhalt.

Es gibt keine festen Regeln, die sagen, dass Sie dies tun müssen, aber es ist eines der Ziele des Frameworks. Die Tatsache, dass alles, einschließlich der Vorlagen, es Ihnen ermöglicht, aus einer gemeinsamen Basis heraus aufzunehmen, bedeutet, dass Ihr Blog sich nahtlos in jedes andere Setup einfügen sollte, indem Sie einfach nach seinem eigenen Teil schauen.

Um jedoch Ihr tatsächliches Problem anzugehen, sagt nichts, dass Sie nicht mit dem Projektordner der obersten Ebene arbeiten können. Das machen Apps und Sie können es tun, wenn Sie es wirklich wollen. Ich tendiere jedoch aus mehreren Gründen nicht dazu:

  • Djangos Standard-Setup tut es nicht.
  • Oft möchte ich eine Haupt-App erstellen, also erstelle ich eine, die normalerweise als website . Zu einem späteren Zeitpunkt möchte ich jedoch vielleicht nur für diese Site die ursprüngliche Funktionalität entwickeln. Um es entfernbar zu machen (ob ich es mache oder nicht), tendiere ich dazu, ein separates Verzeichnis zu erstellen. Dies bedeutet auch, dass ich diese Funktionalität einfach durch Aufheben der Verknüpfung dieses Pakets von der Konfiguration und Entfernen des Ordners löschen kann, anstatt eine komplexe Löschung der richtigen URLs aus einem globalen Ordner urls.py.
  • Sehr oft, selbst wenn ich etwas unabhängig machen möchte, braucht es ein Wohngebiet, während ich mich um es kümmere / es unabhängig mache. Grundsätzlich der oben genannte Fall, aber für Sachen, die ich beabsichtige, generisch zu machen.
  • Mein Top-Level-Ordner enthält oft ein paar andere Dinge, einschließlich, aber nicht beschränkt auf wsgi-Skripte, SQL-Skripte usw.
  • Die Verwaltungserweiterungen von django basieren auf Unterverzeichnissen. Daher ist es sinnvoll, Pakete entsprechend zu benennen.

Kurz gesagt, der Grund, warum es eine Konvention gibt, ist dieselbe wie bei jeder anderen Konvention - sie hilft, wenn es um andere geht, die mit Ihrem Projekt arbeiten. Wenn ich fields.py sehe, fields.py ich sofort, dass Code darin das django-Feld ableitet, wohingegen ich, wenn ich inputtypes.py sehe, nicht so klar inputtypes.py bin, was das bedeutet, ohne es zu betrachten.





project-organization