django: Grube Modelki i chude Kontrolery?

To jest ogólne Pytanie o architekturę. Czytałem w wielu miejscach, że w frameworku MVC (1) modele powinny być grube, a Kontrolery chude. Ale czytałem też, że (2) szczegóły zależą od frameworka, w którym się rozwijasz. A co jeśli rozwijasz się w django?

Moje doświadczenie z django jest takie, że wiele logiki kończy się umieszczaniem w widokach i formach. Nie "logika biznesowa", ale szczegóły obsługi żądań, sesji itp. Pod względem linii kod, te szczegóły często przewyższają logikę biznesową manipulowania obiektami modelu. Robię coś nie tak, czy tak działa django?

Author: jpic, 2011-12-21

3 answers

MVC nie jest uniwersalnym rozwiązaniem i przez większość czasu robi się źle i nie może dotrzymać obietnic: w praktyce modyfikowanie modelu będzie wymagało modyfikacji również w kontrolerze, ponieważ jest zrobione źle. Jeśli naprawdę chcesz luźnego połączenia między modelem a kontrolerem , to-a ludzie zwykle to ignorują-musisz użyć wzorca usługi (otwartego jako obrazek). Czego prawie nikt nie robi.

Zamiast ślepo przylegać do MVC / pseudo-wzorca w w świecie PHP, Django przyjmuje pragmatyczne podejście . Ponieważ we wspólnej rzeczywistości tworzenia oprogramowania, programista programuje rzeczy dla użytkownika, aby zobaczyć. Następnie użytkownik (twój szef, klient, klienci ...) "zobaczy" Twoją pracę i ostatecznie wyda swoją opinię o tym, jak chce ją "zobaczyć" w końcu. Używając Django, deweloper może przyjąć bardziej" zorientowany na widok " schemat rozwoju i zgadnij co: to sprawia, że terminy są łatwiejsze do uszanowania, a użytkownicy bardziej zadowoleni. Jeśli się nad tym zastanowisz, ma swój" NoSQL-owski " pomysł, że widok (widok ogólny, Nie widok django) powinien być szefem tego, co dzieje się za kulisami.

Chciałbym podziękować Django za to, że nie zrobił źle MVC, w przeciwieństwie do 99% implementacji PHP MVC.

Z drugiej strony, Django jest jedynym frameworkiem, który pozwala na właściwą izolację pomiędzy aplikacjami. Każda aplikacja może mieć:

  • modele
  • views
  • szablony
  • URL
  • static pliki
  • testy
  • formularze
  • opcjonalne dodatki (adminy, filtry dla Ajax-selects, uprawnienia dla Django-authority, powiadomienia dla django-notifications, etc, etc)

Więc nawet jeśli twoje modele / widoki/szablony będą powiązane, Twój projekt może być odpowiednio podzielony na małe (również czyta: łatwe w utrzymaniu) i luźno powiązane aplikacje. Tylko powiązane modele/widoki/szablony/rzeczy są powiązane ze sobą. Big fat models script with a big fat views and URL skrypt nie jest tym, czego chcesz w Django. Na przykład nie chcesz, aby dwie klasy modelu, takie jak Article I FootballMatch, żyły razem, chcesz stworzyć aplikację "artykuły" / "blog" i Aplikację "sport", która może żyć niezależnie. Oczywiście czasami muszą być powiązane, w takim przypadku jest to wykonalne na poziomie projektu w 90% przypadków (stworzyłbyś inną aplikację, "blog_sport", gdybyś musiał powiązać Modele lub templatetagi).

Na przykład, bardzo powszechną praktyką jest definiowanie metoda get_absolute_url () w klasie modelu. Tak, twoja klasa modelu, która teoretycznie musi zawierać tylko logikę biznesową, jest teraz powiązana z definicją adresów URL. Jak źle to wygląda w praktyce ?!! W rzeczywistości jest to genialne, ponieważ dodanie tej metody zajmuje dwie sekundy, a następnie można jej używać wszędzie, gdzie używasz modelu: czy to w widokach czy szablonach. Również inne aplikacje(np. django.contrib.admin) użyje go.

Innym nieco bardziej skomplikowanym przykładem geniuszu Django jest to, że zapytania są leniwie oceniane. Co oznacza, że funkcja/Klasa widoku zdefiniuje zapytanie takie jak blog_list = Blog.obiektów.all (), ale zapytanie zostanie faktycznie wykonane w szablonie, jeśli wywoła Jak {%for blog in blog_list %}. Więc logika biznesowa dzieje się w szablonie w tym przypadku, a jeśli coś nie powiedzie się przed renderowaniem szablonu: zapisałeś zapytanie. Ale to nie wszystko, jeśli szablon wyświetla liczbę {{blog_list.count }}, zapytanie select nie zostanie wywołane w ogóle i tylko zapytanie count zostanie wykonane. "Widok ogólny" decyduje, jaka logika biznesowa jest potrzebna. To dalekie od obietnic MVC, ale bądźmy szczerzy: jak praktyczne to jest ?

Chodzi mi o to, że możesz zastosować teorię w niewłaściwy sposób, zrobić to dobrze (co zmniejsza twój wybór do polubienia 5 web frameworków ze wszystkimi językami), lub po prostu przejść do rzeczy w elegancki i pragmatyczny sposób, aby wykonać swoją pracę w sposób Zen w mgnieniu oka: to wybór Django.

 25
Author: jpic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 10:39:29

To zależy od tego, o czym jest Twoja aplikacja, ale piękno Django polega na tym, że nie zmusza cię do umieszczania kodu logicznego w Twoich poglądach lub modelach, to jest twoja decyzja.

Jeśli uważasz, że jakaś logika jest silnie związana z Twoim modelem, możesz zrobić z niego metodę. Zasada (dla mnie) jest taka, że twój model powinien być niezależny od środowiska (web-app, Crontab z poleceniem manage, itp.).

Moja polityka to próba wprowadzenia minimum w moim modelki.

Przy okazji, nie planujesz obsługiwać request i sessions w swoich modelach, prawda ? To zły pomysł.

 3
Author: Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 14:03:32

Mój największy problem z Django polega na tym, że zdają się łamać wzorzec MVC dodając warstwę Forms . Większość dokumentacji wymaga umieszczenia logiki walidacji w formularzach, a fakt, że walidatory modeli są wywoływane tylko przez Formularz zapisuje tylko wzmacnia tę konwencję. Moim zdaniem jest to jednak zła konwencja, bo przecież zbyt często walidowane są dane, które zostaną przekonwertowane na model.

Najlepszym przykładem tego, jak to jest złe jest, jeśli pomyśl o konwersji tradycyjnego projektu Django na projekt skoncentrowany na API z Django Rest Framework i oddzielnym klientem front-end, który po prostu zużywa to API. Zamiast pozostawiać swoje modele nienaruszone i zachowując wiele logiki biznesowej, będziesz musiał przejść przez swoje formularze i przenieść całą logikę do serializerów (niestety, Django Rest Framework również podąża za złamanym wzorcem MVC Django i dodaje dodatkową warstwę "serializer").

Myślę, że podejście fat models jest sposobem na idź. Więcej informacji o tym jak zaimplementować to w Django tutaj.

 0
Author: Ariel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 10:32:17