ugrás a tartalomhoz

Re: Miért tetszik a Django?

Török Gábor · 2010. Jún. 6. (V), 12.54

Ha az emberfia vasárnap reggel szeretné a kisfröccs mellett magába injektálni a Django világ minden varázsát, legegyszerűbb felcsapnia egy Python interpretert, és behúznia a this modult. A Zen of Python híven tükrözi a Django (mint az egyik legkedveltebb Python alapú webes keretrendszer) filozófiáját.

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

A bejegyzés apropóját Pásztor János nyomán megjelent Miért tetszik a Django? cikk adta, amelyben proclub a djangós élményeit sommázza hat pontba szedve. Mint megszállott Django-rajongó, kötelességemnek érzem ezt a lovat nekem is megülnöm, az alábbiakban proclub esszéjére reflektálok. Először kezdjetek nála, majd lapozzatok vissza a Weblaborra.

A Django legfőbb erőssége, hogy Python alapú (elsőként futott GAE-n) és követi annak fennebb citált szellemiségét. Ez biztosítja következetességét, egyértelműségét, de a keretrendszer belépési költségének alacsony szinten tartását is. A Django fölé húzott alkalmazás stack bonyolultságát a reusable appok mintája (nem mellékesen a kód-újrahasznosítást egy kalap alatt lerendezve) nagy mértékben csökkenti. Nincs egy monolitikus kódbázis, ahol tucatnyi fájlokba szervezett, az MVC-nek kényszeresen megfeleltetett (a témáról ld. értekezésemet a jövő héten) osztályok kísértik a kódert. Egyidejűleg egy reusable app van a láthatáron (ami amúgy egy Python modul is, ezzel a névtér és csomagolás problémákat letudtuk), amely az app természetétől függően átlagosan 4-5 fájlt tartalmaz. A fájlok nevei mindemellett standard konvenciót követnek.

Proclub a Django dokumentációját dicséri és az valóban példa értékű. Amellett, hogy a projekt honlapján található egy négyrészes oktatólecke, amelyben az ismerkedőt kézen fogva vezetik végig egy példa alkalmazás megépítésén, kapunk egy folyamatosan naprakészen (verziókészen?) tartott, minden szempontból elégséges és bőséges dokumentációt. Ha ennél mélyebbre szeretnénk ásni, a fejlesztői wikiben olvashatunk a Djangót érintő tervezési megfontolásokról. Mindezek mellett a de-facto Django-alapmű, a The Definitive Guide to Django könyv online olvasható. (A kiadó további djangós kiadványai is jó minőségű források a témában, lásd a Practical Django Projects könyvajánlót a Weblaboron.)

Proclub kiemeli a cím kezelés rugalmasságát. A helyzet az, hogy a Django URL dispatcher alrendszere ennél még jobb. Minden reusable app saját maga felelős a használni kívánt URL-szerkezet kiajánlásáért. Ezt egy urls.py URL modulban kell megtenni. Az URL-ekhez view-kat és egyedi neveket, quasi mnemonikokat rendelhetünk. Ezek segítenek a fordított URL-feloldásban, így a tényleges URL-eket csak egyszer kell rögzítenünk az alkalmazásban, a nézetekben és a template-ekben elég hivatkoznunk az álneveikre. Ezzel az egyszerű absztrakcióval nagyfokú rugalmasságot érünk el. Az URL modulok egymásba ágyazhatók, így a projekt szintű URL modulba csak jelölnünk kell, hogy melyik alkalmazásokból kívánjuk a szolgáltatott urls.py-t betölteni, és azonnal használható felületet kapunk.

A Django template rendszere az egyik legtöbbek által bírált komponense. Sokan inkább a Jinját látnák szívesebben. (Itt jegyezném meg, hogy a Django keretrendszer építőkövei eléggé lazák, de nem minden esetben triviális bármelyik leváltása. Deklaráltan nem célja a projektnek, hogy minden eleme teljesen kicserélhető legyen. Ehelyett inkább egy koherens magot kíván nyújtani.) A Django-sablonok erőssége azok egyszerűségében – nem kötődnek a HTML-hez, bármilyen szöveges kimenet előállításához használhatók (feed, e-mail stb.) – és a sablonörökítésben rejlik. A sablonrendszer nyelvi készlete tudatosan igen szerény, összetettebb logikát a nézeti rétegben kell megvalósítani.

A Djangoban Python nyelvű modelleket gyártunk, és ezekből gyártja le az adatbázis sémát az ORM. Ennek triviális előnyeit proclub összegzi. A piszok jó dolog itt viszont az, hogy ezeket a modelleket újrahasznosíthatjuk admin és űrlap komponens legyártásához is. Egy blogbejegyzést implementáló Entry osztályhoz űrlap biztosítása a szerzők részére a következők szerint történne:

from django.forms import ModelForm
from my_app.models import Entry

class EntryForm(ModelForm):
    class Meta:
        model = Entry

És akkor ez a teljes kód – modul-behívásokkal együtt –, ami a forms.py-ba kerül. A teljesség kedvéért érdemes itt megjegyezni, hogy a Django ORM-je relációs adatmodell központú. Vannak már erőfeszítések más elgondolású rendszerek támogatására.

Sebesség tekintetében releváns tapasztalatom nagyobb terhelésű site-tal kapcsolatban nincsen, viszont pont a napokban nyugtatott meg Farkas Szilveszter, hogy ez ügyben aggodalomra semmi ok, bírni fogja a Django. Az tény, hogy a Django filozófiájában mélyen gyökeredzik a magas rendelkezésre állás, ebbéli megfontolásból például külön szervert követel meg a statikus állományok kiszolgálására. Az 1.2-es verzióban több egyidejű adatbázis kapcsolatot támogat, így akár külön adatbázisszerver használható adatolvasásra és -írásara. A témában érdekes lehet Mike Malone Scaling Django c. esszéje.

Végül két jellemző, ami teljessé teszi proclub Miért tetszik a Django? kérdésére adott válaszomat.

A signals alrendszer az újrafelhasználó alkalmazások minél lazább kapcsolatát segíti. Minden alkalmazás definiálhat szignálokat, ezeket más alkalmazások figyelhetik, és azok vonalra küldésekor reagálhatnánk rá. Semmi varázslat nincs ebben, keretrendszerenként más-más név alatt fut ez a funkcionalitás: néhol eseményekként jelennek meg, van ahol hookokkal implementálják. Egymásról nem tudó alkalmazások tudnak a segítségével együtt dolgozni.

Utoljára említem az egységtesztelést, de a kor divatjának megfelelően érdemes lett volna ezzel nyitnom. Nem azt szeretném kiemelni, hogy a Django teljes kódját egységtesztek fedik, és a saját alkalmazásunk egységteszteléséhez is megad minden eszközt a keretrendszer, hanem hogy a Django is csak Python, így a Pythonhoz elérhető doctest és unittest egységtesztelő keretrendszerekkel dolgozhatunk. Utóbbi egy xUnit-implementáció, a doctestről viszont részletesebben szólnék. Pythonban a modulhoz, osztályhoz vagy függvényhez kötött dokumentáció nyelvi elem. Ez azt jelenti, hogy a Python kód nyelvtanában a fejlesztői dokumentációt nem megjegyzésként, hanem ún. docstringként jelöljük.

def add(x, y):
    """Összeadja x-et és y-t."""
    return x + y

Ezt aztán bárhol számon is kérhetjük az interpretertől.

>>> help(add)
Help on function add in module __main__:

add(x, y)
    Összeadja x-et és y-t.

Ezt a számos szempontból már érdekes tulajdonságot aknázza ki a doctest, ami lehetővé teszi, hogy a docstringben egyúttal elemi egységtesztet is elhelyezzünk.

def add(x, y):
    """Összeadja x-et és y-t.

    >>> add(-5, 7)
    2
    >>> add("2", 1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in add
    TypeError: cannot concatenate 'str' and 'int' objects
    """
    return x + y

A legtöbb iskola abban egyetért, hogy az egységtesztek kiváló use case-ek, jól példázzák a kóder célját az adott komponenssel. A docstringbe ágyazott egységteszt formátuma a Python-interpreterből kimásolt szöveg, hogy még egyszerűbb dolgunk legyen. Ennél kézenfekvőbb és ennyire szoros integráltságot nyelv és egységtesztelés között más platformnál én még nem láttam.

Összegzésül talán a legfontosabb intelem, hogy Django is Python. Ha egyetértesz a Python zenjével, tetszeni fog a Python és a Django is. Munkát, állást pedig fogsz kapni. A Weblabor munka rovatában is rendre felbukkannak Django-fejlesztőt kereső hirdetések.

 
1

Köszönöm!

janoszen · 2010. Jún. 6. (V), 22.09
Köszönöm szépen a reflektálást, nagyon kellemes olvasmány volt így vasárnap estére. Megnyugtató hogy zöldfülü Pythonosként sikerült nem félreértenem a dolgokat.

Kérlek, legyen több Pythonos és / vagy Djangós téma! Szívesen írok is ha elvállalod a lektorálást.
2

Sebesseg temaja

dyuri · 2010. Jún. 7. (H), 11.08
Mi csinaltunk/uzemeltetunk olyan django alapu oldalt, amit egy gep szolgal ki mindenestol, napi majd 400k oldalletoltes van, es nem a django a szuk keresztmetszet, szoval birja.
3

PHP mellé kerestem valami más

duplabe · 2010. Jún. 7. (H), 12.09
PHP mellé kerestem valami más nyelvet, hogy bővítsem a tudásom és végül a python+django párosnál kötöttem ki (a másik esélyes a ruby volt, de azt majd később). El is kezdtem benne írni egy kis hobbi projectet, de időhiány miatt megakadt kicsit. Viszont a djangoba beleszerettem. Lassan haladtam vele, mert a django mellett a python is ismeretlen volt számomra. Talán nem is a djangoval kellett volna kezdeni, hanem a pythonnal megismerkedni tisztességesen. Az egész olyan elegáns. Mindenképpen visszatérek majd rá és jobban megismerem, és másoknak is ajánlani fogom.
4

És még mennyi...

istvanf · 2010. Jún. 7. (H), 13.22
És még mennyi ilyen aprósága van, aminek megörül az ember, amikor szüksége van a dologra, és kiderül, hogy nem is olyan bonyolult...

Például hogy a djangos alkalmazások file kezelése is teljesen felülírható - lehet olyan modelled, amelynél ( az egyébként a modellből generált ) form postolásakor a feltöltött file-t nem lokális gépre menti, hanem Amazon AWS szerverre. Mindez teljesen transzparens, nem kell MÁSHOGYAN csinálnod semmit a view-kban, egyszerűen paraméterként a megfelelő helyen megadod hogy melyik file-kezelő réteget használod ( lásd Storage API ).

Vagy a template tagek használata, egészen komoly célokra is akár - pl. táblázatos megjelenítés esetén lapozás és oszlop alapján sorbarendezés - szerver oldalon, a model vagy view fileok módosítása nélkül. szimplán template tagekkel.
5

A nagy hipe hullamban azert ...

Sulik Szabolcs · 2010. Jún. 15. (K), 12.24
... lenne nehany kerdesem. Igazabol csak egyet emelnek ki.

Ez itt a cache api leirasa

Ez a borzasztoan konzekvens rendszer hogyan adhat nekem indirekt magiaval egy cachet, amirol ugy gondolja, hogy az nekem jo lesz? Tudom, tudom, felette mindenfele konfiggal be lehet allitani, de ez sok minden, csak nem explicit dolog.

Mi van akkor, ha nekem tobb kulonbozo cache-em van? Mit fog adni? Kivancsi vagyok, mert ha gondolatot is tud olvasni, akkor megnezem a cuccot :)
6

Hol van mágia?

Török Gábor · 2010. Jún. 15. (K), 12.44
Nem látom, mi a mágia? A hivatkozott API az általad kiválasztott cache backendre épül. Ez lehet például Memcached. Ezt éred el egy egységes felületen. Egyidejűleg több cache backendet nem támogat, úgy tudom.
7

mágia

fqqdk · 2010. Jún. 15. (K), 14.39
8

Az alapveto problema...

Sulik Szabolcs · 2010. Jún. 19. (Szo), 13.03
... hogy global scope valtozokra epit a rendszer, ami magikus viselkedest eredmenyezhet indirekt modon.

Ugy sejtem, hogy php fejlesztokent te magad is kerulod a global kulcsszo es a $GLOBALS superglobal hasznalatat. Az teny, hogy python-ban nincsenek ilyenek, de ez nem helyezi hatalyon kivul magat az elvet, vagyis hogy a leheto legkevesebb munkat vegezd global scope-ban, ne alapozz global scope valtozokra. Furcsa, hogy ezt mintha figyelmen kivul hagytak volna a django fejlesztok.

Es mivel igy allitjak ossze a dolgaikat, mar nem is olyan furcsa az, hogy miert csak egy cache backendet tudnak tamogatni, miert csak 1.2-tol van tobb db kapcsolat tamogatas (amit egyebkent nem egy nagy kulonlegesseg).

Proclub pedig okosan kikapcsolta a kommentelest az oldalan. Az egesz hiperol, vagyis a "hasznald a kovetkezo projektednel, majd meglatod milyen jo" egy regi vicc uj formaja jut eszembe:

- Van egy problemam. Webalkalmazasokat kell fejlesztenem.
- Hasznalj django-t!
- Na, most mar harom problemam van.
9

Elfogadom az érveidet

Török Gábor · 2010. Jún. 20. (V), 12.52
Elfogadom az érveidet, messze nem a legjobb keretrendszer a Django, mindemellett tucatnyi jó minőségű megoldás, ötlet található benne, amiket érdemes tanulmányozni, és amelyekkel kényelmes dolgozni. A támadási felületednek beállított hype pedig ennél a cikknél nincs jelen, pucér érveket sorakoztatott fel a Django mellett előbb proclub, majd én.

Az általad említett globális változók a konfigurációs settings modulból importált konstansok. Ezt korántsem tartom egyenértékűnek a PHP-s globals-szal.

A reusable app koncepcióját álláspontod védelmében úgy csavarod, hogy az sebezhető legyen. Elsősorban azt emeltem ki, hogy a bonyolultságot csökkenti, és valóban erre szolgál. Az a folyamatos törekvés (magamról beszélek), hogy egymástól jól elkülönített, egy funkcióra koncetráló komponenseket dolgozzon ki az ember, jobb programozóvá nevel, és a végeredményeképpen átláthatóbb, karbantarthatóbb kódot szül. Mindemellett a jó minőségű app valóban plugabble, de ez nem jelenti azt, hogy semmi további dolgom nincs vele. Ha úgy tetszik, az öröklődés mintáját követi app szinten.
10

Nem a django ellen...

Sulik Szabolcs · 2010. Jún. 22. (K), 09.11
... van kifogasom. Pusztan arrol van szo, hogy ki es mire akar hasznalni publikus frameworkot. Alapvetoen ezen frameworkok letet a Pareto-elv igazolja, mondvan az idod 80%-at a kodod 20%-an fogod eltolteni. Csakhogy ez az elv ellenervkent is szerepelhet, hiszen nagyobb projekt eseten, akkor mar nem nagy effort letrehozni az alap architekturat, es nem kiszolgaltatva lenni masoknak.

Az elmult nehany ev azt mutatja, hogy akkor hasznalj publikus keretrendszert, ha
1. vagy kis projektjeid vannak (2-3 honapos fejlesztes) es tulzottan nem lesz vele support feladat
2. vagy kicsit nagyobb projektjeid vannak, support meg minden, viszont nagyon hasonloak (pl cms-eket raksz ossze / jajj de rossz pelda :) )
Pl elkezded a munkat kedvenc keretrendszeredben, majd 1-1,5 ev mulva kell valamit meg fejlesztened hozza, de azota mar a fejlesztok oles leptekkel haladva csomo mindent megvaltoztattak a rendszerben, a verzio, amit hasznaltal mar nem tamogatott, stb. Ez akar problemas is lehet (persze nem feltetlenul az).
Az általad említett globális változók a konfigurációs settings modulból importált konstansok. Ezt korántsem tartom egyenértékűnek a PHP-s globals-szal.

Ha konstans, ahogy emlited, akkor hogyan is fogom en beallitani a sajat alkalmazasombol? Erzed az ellentmondast.
A reusable app koncepcióját álláspontod védelmében úgy csavarod, ...

A reusable appokrol pont nem irtam, de mindenesetre elgondolkoztato, hogy amikor sok libet adapterrel erdemes hasznalni, hogy az igenyeimnek megfelelo legyen, akkor mennyiben mukodhet ez app szinten? Ertem en, hogy sokaknak, kis projekteknel csak osszedobalom es mukodik rendezoelv nagyon kenyelmes, csak en sosem voltam tulzottan hive ennek a megoldasnak, mert valahogy soha sem "teljes" azt csinaltak ezek a reusable appok/pluginok/extensionok ami igazan kellett volna.
11

konstans

dyuri · 2010. Jún. 25. (P), 15.08
Ha konstans, ahogy emlited, akkor hogyan is fogom en beallitani a sajat alkalmazasombol? Erzed az ellentmondast.

Hat nemtom, a konstans szerintem attol konstans, hogy _egyszer_ azert beallithatod, hogy mi legyen az erteke :)

Azzal viszont teljes mertekben egyetertek, hogy ha valami specialisat/nagyobbat kell csinalni, akkor a frameworkok csak akadalyoznak. Es pont a 2008-as DjangoCon-on tartott errol egy eloadast Cal Henderson (a flickr megalkotoja).