wo genau sollte Python-Geschäftslogik in Django platziert werden

26

Ich habe gerade angefangen, Django / Python / Web Development zu lernen. Dieses Problem beschäftigt mich schon eine Weile.

Ich erstelle eine Anwendung mit mehreren Vorlagen in Django. Ich habe eine views.py, die im Grunde nur die Antworten auf die jeweiligen Vorlagen rendert, und ich habe eine models.py, in der ich meine DB strukturiert habe. In einer meiner Vorlagen muss ich ein Bild hochladen (was ich kann) und ich muss eine Logik ausführen, die auf den Funktionen des hochgeladenen Bildes basiert (was noch nicht geschehen ist). Diese Logik erfordert viele schwere Berechnungen. Nach Durchführung der Berechnungen sollte die Logik einige verarbeitete Informationen (Koordinaten) an die Vorlage zurückgeben.

Ich war in der Lage, alle diese Aktionen erfolgreich in einer eigenständigen Python-Desktop-Anwendung auszuführen, die Python-Dateien nacheinander aufruft. Da ich dies nun zu einer Webanwendung machen möchte, habe ich begonnen, das Django-Framework zu verwenden.

Ich habe viel gesucht, kann aber immer noch nicht herausfinden, wo genau ich diese Python-Datei mit der gesamten Logik platzieren soll. Sollte ich eine andere klassenbasierte Datei haben (logic.py)und sie von der aufrufen view.py? Ich habe gegoogelt und festgestellt, dass viele Entwickler ihre Geschäftslogik in ihre models.py in Django einfügen. Ich finde es jedoch intuitiv nicht richtig, da das Modell ausschließlich mit dem Backend kommunizieren soll. Jede Hilfe wäre dankbar. Vielen Dank im Voraus.

adrita
quelle
Mögliches Duplikat von Wo soll die Geschäftslogik in MVC-Design eingefügt werden?
Bart van Ingen Schenau
Es wurde ein Artikel gefunden, der dieses Thema ausführlich behandelt (mit Blick auf die Pyramide, nicht auf Django). Hat einige vernünftige Gedanken: nando.oui.com.br/2014/04/01/…
kratenko

Antworten:

16

Ich habe viel gesucht, kann aber immer noch nicht herausfinden, wo genau ich diese Python-Datei mit der gesamten Logik platzieren soll.

Abhängig von Ihren Anforderungen gibt es eine Reihe von Optionen:

  1. Fügen Sie die Logik zB dem ImageModell hinzu. Dies ist eine nützliche Option, wenn Sie Metadaten pro Bild in der Datenbank speichern müssen und jede Modellinstanz (jedes Bild) für sich verarbeitet wird.

  2. Fügen Sie die Logik als einfache Python- ImageKlasse hinzu, z. B. in einer Datei mit dem Namen image.py. Nichts in Django hindert Sie daran, eine andere Logik als die in den Modulen viewsoder hinzuzufügen models. Dies ist eine gute Option, wenn die Bildlogik eine zentrale Komponente Ihrer Django-App ist (z. B. eine Bildverarbeitungs-App).

  3. Erstellen Sie ein separates Python-Projekt, das die Logik bereitstellt, und rufen Sie es dann in Ihren Ansichten auf. Stellen Sie sicher, dass Sie dieses Projekt in der Python-Umgebung Ihrer Django-App installieren. Diese Option ist gültig, wenn der Zweck Ihrer Django-App darin besteht, Bilder hochzuladen und anzuzeigen oder die Ergebnisse der Bildverarbeitung als direkte Antwort auf eine Benutzeranforderung anzuzeigen, die Bildverarbeitung jedoch auch von anderen Projekten verwendet werden kann.

  4. Erstellen Sie eine separate App, die Anforderungen asynchron verarbeitet und separat von Ihrer Django-App ausgeführt wird. Diese Option ist nützlich, wenn Sie die Bildverarbeitung vom Anforderungszyklus der App abkoppeln, eine große Anzahl von Bildern verarbeiten müssen oder wenn jede Berechnung zu lange dauert, um sie innerhalb eines Anforderungszyklus zu lösen (z. B. innerhalb von höchstens 500 ms bis 1 s). .

Ich finde es intuitiv nicht richtig, da Model ausschließlich mit dem Backend kommunizieren soll.

In Django gibt es nichts, was ein Modell erfordert, um mit dem Back-End oder der Datenbank zu kommunizieren. Ich denke, Sie mischen die Semantik dessen, was Django normalerweise als Modell ansieht (nämlich eine Abstraktion einer oder mehrerer Tabellen in der Datenbank), mit dem Begriff Modell als Designkonstrukt (z. B. wie in Domain Driven Design).

miraculixx
quelle
Vielen Dank! Es war wirklich aufschlussreich. Ich denke, Option 3 sollte für mich gut genug sein. :)
Adrita
Es ist in Ordnung, die Antwort negativ zu bewerten, aber bitte einen Kommentar hinzufügen, damit ich es verbessern kann
miraculixx
5

Daniel Greenfeld, Co-Autor von "Two Scoops of Django", empfiehlt, dass die Geschäftslogik nach Möglichkeit in den Modellen oder nach Bedarf in den Formularen enthalten sein sollte Wie hier in der offiziellen Django- Dokumentation unter @adrita erläutert, müssen Sie möglicherweise die offizielle Dokumentation lesen, um das Konzept der Modelle, Ansichten und Vorlagen ein wenig besser zu verstehen.

diek
quelle
danke für eure vorschläge.
Ich
Ich bin froh, dass du es repariert hast. @Miraculixx gab eine solide Erklärung. Wenn Sie auf fb sind, treten Sie der Django-Python-Framework-Gruppe bei.
Diek
2

In den offiziellen Django-Dokumenten https://docs.djangoproject.com/en/1.11/ heißt es:

Django hat das Konzept der "Ansichten", um die Logik zu kapseln, die für die Verarbeitung der Benutzeranforderung und die Rückgabe der Antwort verantwortlich ist. Alles, was Sie über Ansichten wissen müssen, finden Sie über die folgenden Links:

Django empfiehlt die Logik, die in den Ansichten enthalten sein soll.

Simon
quelle
3
Das ist nicht unbedingt dasselbe wie Geschäftslogik.
Vorname
1
Ich bin mit dieser Interpretation der Django-Dokumentation nicht einverstanden. An anderer Stelle in der Django-Dokumentation (z. B. für Model.clean()) wird etwas expliziter impliziert, dass (wenn wir einfach ein reales Django-Projekt für Modelle, Vorlagen und Ansichten erstellen) die Geschäftslogik (oder zumindest die Validierung) in die Modellebene. Beachten Sie, dass ich keine Formulare in diese Vereinfachung aufgenommen habe, die auch akzeptabel sind.
Kye R