dove esattamente dovrebbe essere collocata la logica aziendale di Python in Django


26

Ho appena iniziato a studiare Django / Python / Web Development. Questo problema mi ha turbato per un po 'di tempo.

Sto creando un'applicazione con più modelli in Django. Ho un file views.py che in pratica sta semplicemente visualizzando le risposte ai rispettivi modelli e ho un modello.py in cui ho strutturato il mio DB. In uno dei miei modelli, devo caricare un'immagine (cosa che sono in grado di fare) e devo eseguire una logica basata sulle funzionalità dell'immagine caricata (non ancora eseguita). Questa logica comporta molti calcoli pesanti. Dopo aver eseguito i calcoli, la logica dovrebbe restituire alcune informazioni elaborate (coordinate) al modello.

Sono stato in grado di eseguire tutte queste azioni con successo in un'applicazione desktop autonoma Python chiamando i file Python uno dopo l'altro. Tuttavia, poiché ora desidero rendere questa un'applicazione Web, ho iniziato a utilizzare il framework Django.

Ho fatto molte ricerche ma non riesco ancora a capire esattamente dove dovrei posizionare questo file Python contenente tutta la logica. Dovrei avere un altro file basato sulla classe (logic.py)e chiamarlo dal view.py? Ho cercato su Google e ho scoperto che molti sviluppatori stanno inserendo la loro logica di business nei loro modelli. Spia in Django. Tuttavia, ritengo che non sia intuitivamente corretto poiché il modello dovrebbe comunicare esclusivamente con il back-end. Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.



Ho trovato un articolo che discute ampiamente di questo argomento (pensando alla piramide, non al django). Ha dei buoni risentimenti: nando.oui.com.br/2014/04/01/…
kratenko,

Risposte:


16

Ho fatto molte ricerche ma non riesco ancora a capire esattamente dove dovrei posizionare questo file Python contenente tutta la logica.

Esistono diverse opzioni, a seconda delle tue esigenze:

  1. Aggiungi la logica, ad esempio il Imagemodello. Questa è un'opzione utile se è necessario archiviare i metadati per immagine nel database e ciascuna istanza del modello (ogni immagine) viene elaborata da sola.

  2. Aggiungi la logica come una semplice Imageclasse Python , ad esempio in un file chiamato image.py. Nulla in Django ti impedisce di aggiungere una logica diversa da quella nei moduli viewso models. Questa è una buona opzione se la logica dell'immagine è un componente centrale della tua app Django (ad es. Un'app di elaborazione delle immagini).

  3. Crea un progetto Python separato che fornisce la logica, quindi chiamalo dalle tue viste. Assicurati di installare questo progetto nell'ambiente Python della tua app Django. Questa opzione è valida se lo scopo della tua app Django è caricare e visualizzare immagini o mostrare i risultati dell'elaborazione delle immagini in risposta diretta alla richiesta di un utente, ma dove l'elaborazione delle immagini potrebbe essere utilizzata anche da altri progetti.

  4. Crea un'app separata che elabora le richieste in modo asincrono e viene eseguita separatamente dall'app Django. Questa opzione è utile se è necessario disaccoppiare l'elaborazione delle immagini dal ciclo di richiesta dell'app, elaborare un gran numero di immagini o dove ogni calcolo impiega troppo tempo per risolversi entro il tempo di un ciclo di richiesta (diciamo al massimo da 500ms a 1s) .

Sento che intuitivamente non è giusto poiché il modello dovrebbe comunicare esclusivamente con il back-end.

Non c'è nulla in Django che richiede un modello per comunicare con il back-end, o meglio con il database. Penso che tu stia mescolando la semantica di ciò che Django in genere considera un modello (ovvero un'astrazione di una o più tabelle nel database), rispetto al termine modello come costrutto di progettazione (ad esempio come nel Domain Driven Design).


Grazie! È stato davvero penetrante. Credo che l'opzione numero 3 dovrebbe essere abbastanza buona per me. :)
Adriana,

Va bene valutare la risposta negativa, ma per favore aggiungi un commento così posso migliorarlo
miraculixx

5

Daniel Greenfeld, coautore di "Two Scoops of Django, raccomanda che la logica aziendale dovrebbe essere nei modelli" quando possibile, o nelle forme se necessario. "Per quanto riguarda il possibile duplicato di Bart, django potrebbe essere simile a MVC ma è non MVC. Come spiegato qui nella FAQ ufficiale sulla documentazione di Django . @adrita, penso che potrebbe essere necessario rivedere la documentazione ufficiale per aiutarti a capire un po 'meglio il concetto di modelli, viste e modelli.


Grazie per i vostri suggerimenti. esamineremo sicuramente la documentazione :)
adrita,

Sono contento che tu l'abbia risolto, @miraculixx ha dato una solida spiegazione. Se sei su fb, unisciti al gruppo framework django python.
Diek,

2

Nei documenti ufficiali di Django https://docs.djangoproject.com/en/1.11/ , si dice:

Django ha il concetto di "viste" per incapsulare la logica responsabile dell'elaborazione della richiesta di un utente e della restituzione della risposta. Trova tutto ciò che devi sapere sulle visualizzazioni tramite i link seguenti:

Django raccomanda che la logica sia contenuta nelle viste.


3
Questo non è necessariamente lo stesso della logica aziendale.
FirstLastname

1
Non condivido questa interpretazione della documentazione di Django. Altrove nella documentazione di Django (ad es. Per Model.clean()) è implicito un po 'più esplicitamente che (se si tratta semplicemente di un progetto Django nel mondo reale di modelli, modelli e viste) - la logica aziendale (o almeno la convalida) appartiene alla livello del modello. Si noti che non ho incluso moduli in tale semplificazione, che sono anche accettabili.
Kye R,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.