2007-01-12

Why Django sucks

Django sucks. I tyle. Pytanie tylko czy istnieje jakiś framework, który mniej sucks. I tu odpowiedzi niestety nie znam.

Django ma sporo poważnych wad. Domyślny system templateów jest żałosny. Sorry, w nim nie da się odróżnić foo[bar] od foo.bar, nie da się zdefiniować funkcji czy nawet makra.
Kierowany chęcią uruchamiania normalnych pythonowych wyrażeń przesiadłem się na template genshi.
Genshi też nie potrafi wszystkiego, ma problemy np z zagnieżdżeniami komentarzy lub cudzysłowów. Jednak jest nieporównywalnie przyjemniejsze dla programisty niż cholerne djangotemplates.
W dalszej perspektywie przymierzam się do wypróbowania makotemplates. Wygląda na to, że te template nie mają tych wad co genshi. Choć nie mają też tych samych możliwości jak np xml z xpathem.

Inne z mechanizmów django, których nie da się używać to 'forms and manipulators' czyli obsługa formularzy htmlowych. Strasznie namieszali z nazewnictwem. W kodzie mylą pojęcia, trudno zorientować się czy 'field' to pole w sensie atrybutu na modelu czy widget, który wyświetla jakiegoś boxa htmlowego. Tym niemniej największą wadą djangowych formularzy jest kompletny brak możliwości zmiany ich zachowania.
Chciałem zmienić kilka widgetów, tak aby dodać im htmlowy atrybut 'readonly'. Oczywiście modyfikowanie źródeł django odpada, więc stosując monkey patching powolutku pozmieniałem zachowanie kolejnych widgetów (lub Fieldów w notacji django). Mój kod poprawek rósł i rósł. Z pomysłu na zmianę djangowych widgetów trzeba było w końcu zrezygnować.

Ostatecznie sam napisałem system widgetów. Jest prosty, czysty i ma spore możliwości. I co najważniejsze, nie jest sztywno związany z django. Integracja z django to zaledwie jedna funkcja, która robi mokey patching na modelu i kilka funkcji generujących widgety.

Po tych cięciach wychodzi na to, że jedyne cechy django, z których da się kożystać to ORM i cała logika http typu dekodowanie url i obsługa http request i responce. A to nie wiele jak na nowoczesny framework.



2 comments:

forgems said...

>> Sorry, w nim nie da się odróżnić foo[bar] od foo.bar
Sorry, ale po co mam to designer ma wiedziec czy coś jest słownikiem, obiektem czy listą?

>> zdefiniować funkcji
Po co, to przecież system templatów

>> makra
Dziedziczenie nie wystarcza ???

>>Inne z mechanizmów django, których nie da się używać to 'forms and manipulators' czyli obsługa formularzy htmlowych

Welcome to 2005 :P Newforms jest o niebo lepszy.

pozdrowienia z pokoju w którym się zna i używa django :)

Marcin Wnuk Lipinski said...

Zgodzę się z przedmówcą. Panie Majek jest Pan samoukiem? Radziłbym poczytać trochę o wzorcach projektowych (głównie gof), poczytać na czym polega idea programowania obiektowego (w tym wady i zalety dziedziczenia), wreszcie poczytać o wzorcu MVC i refaktoryzacji. Proszę też nie traktować tego jako atak, wszak każdy z nas musi się uczyć całe życie.