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ę.
Odpowiedzi:
Istnieje wiele opcji, w zależności od wymagań:
Dodaj logikę np. Do
Image
modelu. 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.Dodaj logikę jako zwykłą
Image
klasę Python , np. W pliku o nazwieimage.py
. Nic w Django nie ogranicza Cię do dodawania logiki innej niż ta w modułachviews
lubmodels
. Jest to dobra opcja, jeśli logika obrazu jest centralnym elementem aplikacji Django (np. Aplikacji do przetwarzania obrazu).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.
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) .
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).
źródło
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.
źródło
W oficjalnej dokumentacji Django https://docs.djangoproject.com/en/1.11/ napisano:
Django zaleca, aby logika była zawarta w widokach.
źródło
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.