gdzie dokładnie należy umieścić logikę biznesową Pythona w Django

26

Właśnie zacząłem uczyć się Django / Python / Web Development. Ten problem od dłuższego czasu mnie niepokoi.

Tworzę aplikację z wieloma szablonami w Django. Mam views.py, który w zasadzie renderuje odpowiedzi na odpowiednie szablony i mam models.py, w którym ustrukturyzowałem swoją bazę danych. W jednym z moich szablonów muszę załadować obraz (co jestem w stanie zrobić) i muszę uruchomić logikę opartą na funkcjach przesłanego obrazu (jeszcze nie zrobione). Ta logika wymaga wielu ciężkich obliczeń. Po wykonaniu obliczeń logika powinna zwrócić przetworzone informacje (współrzędne) do szablonu.

Udało mi się wykonać wszystkie te działania z powodzeniem w samodzielnej aplikacji komputerowej w języku Python, wywołując pliki Python jeden po drugim. Ponieważ jednak chcę teraz uczynić tę aplikację internetową, zacząłem używać frameworka Django.

Przeprowadziłem wiele poszukiwań, ale nadal nie jestem w stanie dowiedzieć się, gdzie dokładnie powinienem umieścić ten plik Pythona zawierający całą logikę. Czy powinienem mieć inny plik oparty na klasie (logic.py)i wywoływać go z view.py? Poszukałem go i stwierdziłem, że wielu programistów umieszcza logikę biznesową w swoich models.py w Django. Uważam jednak, że intuicyjnie nie jest to właściwe, ponieważ model powinien komunikować się wyłącznie z zapleczem. Dziękujemy za pomoc. Z góry dziękuję.

adrita
źródło
możliwy duplikat Gdzie umieścić logikę biznesową w projekcie MVC?
Bart van Ingen Schenau
Znaleziono artykuł, który obszernie omawia ten temat (z myślą o piramidzie, a nie django). Ma sensowne myśli: nando.oui.com.br/2014/04/01/…
kratenko

Odpowiedzi:

16

Przeprowadziłem wiele poszukiwań, ale wciąż nie jestem w stanie dowiedzieć się, gdzie dokładnie powinienem umieścić ten plik Pythona zawierający całą logikę.

Istnieje wiele opcji, w zależności od wymagań:

  1. Dodaj logikę np. Do Imagemodelu. Jest to przydatna opcja, jeśli chcesz przechowywać metadane dotyczące poszczególnych obrazów w bazie danych, a każda instancja modelu (każdy obraz) jest przetwarzana samodzielnie.

  2. Dodaj logikę jako zwykłą Imageklasę Python , np. W pliku o nazwie image.py. Nic w Django nie ogranicza Cię do dodawania logiki innej niż ta w modułach viewslub models. Jest to dobra opcja, jeśli logika obrazu jest centralnym elementem aplikacji Django (np. Aplikacji do przetwarzania obrazu).

  3. Utwórz osobny projekt w języku Python, który zapewnia logikę, a następnie wywołaj go ze swoich widoków. Zainstaluj ten projekt w środowisku Python aplikacji Django. Ta opcja jest ważna, jeśli celem Twojej aplikacji Django jest przesyłanie i przeglądanie obrazów lub wyświetlanie wyników przetwarzania obrazów w bezpośredniej odpowiedzi na żądanie użytkownika, ale w przypadku gdy przetwarzanie obrazu może być również wykorzystane przez inne projekty.

  4. Utwórz osobną aplikację, która przetwarza żądania asynchronicznie i będzie uruchamiana niezależnie od aplikacji Django. Ta opcja jest przydatna, jeśli chcesz oddzielić przetwarzanie obrazu od cyklu żądania aplikacji, przetworzyć dużą liczbę obrazów lub gdy każde obliczenie zajmuje zbyt dużo czasu w celu rozwiązania w czasie cyklu żądania (powiedzmy co najwyżej 500ms do 1s) .

Wydaje mi się, że intuicyjnie nie jest to właściwe, ponieważ model powinien komunikować się wyłącznie z zapleczem.

W Django nie ma nic, co wymagałoby modelu do komunikacji z zapleczem, a raczej z bazą danych. Myślę, że łączysz semantykę tego, co Django zwykle uważa za model (a mianowicie abstrakcję jednej lub kilku tabel w bazie danych), a pojęciem modelu jako konstrukcją projektową (np. Jak w projektowaniu opartym na domenie).

miraculixx
źródło
Dzięki! To było naprawdę wnikliwe. Uważam, że opcja nr 3 powinna być dla mnie wystarczająca. :)
adrita,
W porządku, aby ocenić odpowiedź negatywną, ale proszę dodać komentarz, bym mógł go poprawić
miraculixx
5

Daniel Greenfeld, współautor „Two Scoops of Django” zaleca logikę biznesową w modelach „jeśli to możliwe lub w formularzach, jeśli musisz.” Jeśli chodzi o możliwy duplikat Barta, django może być podobny do MVC, ale jest nie MVC. Jak wyjaśniono tutaj w oficjalnej dokumentacji django - często zadawane pytania. @adrita, myślę, że może zajść potrzeba przejrzenia oficjalnej dokumentacji, aby lepiej zrozumieć pojęcie modeli, widoków i szablonów.

diek
źródło
dzięki za sugestie. na pewno
przejrzy
Cieszę się, że to naprawiłeś, @miraculixx dał solidne wyjaśnienie. Jeśli korzystasz z fb, dołącz do grupy frameworków django python.
diek
2

W oficjalnej dokumentacji Django https://docs.djangoproject.com/en/1.11/ napisano:

Django ma pojęcie „widoków”, aby zawrzeć logikę odpowiedzialną za przetwarzanie żądania użytkownika i zwracanie odpowiedzi. Znajdź wszystko, co musisz wiedzieć o widokach, korzystając z poniższych linków:

Django zaleca, aby logika była zawarta w widokach.

Szymon, Szymek
źródło
3
To niekoniecznie to samo co logika biznesowa.
FirstLastname
1
Nie zgadzam się z taką interpretacją dokumentacji Django. Gdzie indziej w dokumentacji Django (np. Dla Model.clean()) sugeruje się nieco bardziej wyraźnie, że (jeśli jesteśmy po prostu prawdziwym projektem Django dla modeli, szablonów i widoków) - logika biznesowa (lub przynajmniej walidacja) należy do warstwa modelowa. Pamiętaj, że nie uwzględniłem formularzy w tym uproszczeniu, które są również dopuszczalne.
Kye R