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.
Antworten:
Abhängig von Ihren Anforderungen gibt es eine Reihe von Optionen:
Fügen Sie die Logik zB dem
Image
Modell 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.Fügen Sie die Logik als einfache Python-
Image
Klasse hinzu, z. B. in einer Datei mit dem Namenimage.py
. Nichts in Django hindert Sie daran, eine andere Logik als die in den Modulenviews
oder hinzuzufügenmodels
. Dies ist eine gute Option, wenn die Bildlogik eine zentrale Komponente Ihrer Django-App ist (z. B. eine Bildverarbeitungs-App).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.
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). .
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).
quelle
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.
quelle
In den offiziellen Django-Dokumenten https://docs.djangoproject.com/en/1.11/ heißt es:
Django empfiehlt die Logik, die in den Ansichten enthalten sein soll.
quelle
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.