3. diel - Predstavenie MVC a MVT architektúry v Django
V predchádzajúcej lekcii, Zoznámenie s frameworkom Django pre Python, sme si vytvorili svoju prvú webovú aplikáciu vo frameworku Django pre Python. Popasovali sme sa s routovaním a vypísali hlášku "Hello world!".
Než začneme používateľovi servírovať skutočné HTML stránky, v dnešnom tutoriáli webových aplikácií s frameworkom Django si predstavíme tzv. MVC architektúru a jej Django obdobu MVT. MVC architektúra sa totiž používa v návrhu takmer všetkých webových aplikácií.
Architektúra MVC
MVC je veľmi obľúbený architektonický vzor, ktorý sa uchytil najmä na webe, hoci pôvodne vznikol na desktopoch. Je súčasťou populárnych webových frameworkov, akými sú napr. Zend alebo Nette pre PHP, Ruby On Rail pre Ruby alebo ASP.NET pre .NET. Bez podobného vzoru je veľmi ťažké predstaviť si fungovanie zložitejšieho webu.
Motivácia
Základnou myšlienkou MVC architektúry je oddelenie logiky od výstupu. Rieši teda problém tzv. "špagetového kódu", kedy máme v jednom súbore (triede) logické operácie a zároveň renderovanie výstupu. Súbor teda obsahuje databázové dotazy, logiku (volanie Python príkazov) a rôzne pohádzané HTML tagy. Všetko je zamotané do seba ako špagety.
Kód sa samozrejme zle udržiava, nieto ešte rozširuje. Je zle highlightovaný, pretože si s ním IDE nevie rady, HTML nie je správne naformátovaný, strácame sa v jeho stromovej štruktúre. Našim cieľom je, aby zdrojový kód s logikou vyzeral ako zdrojový kód (Python) a výstup vyzeral ako HTML stránka s čo najmenšou prímesou ďalšieho kódu.
Komponenty
Celá aplikácia je rozdelená na komponenty troch typov, hovoríme o Modeloch, View ("Pohľadoch") a Control ("Kontroléroch"), odtiaľ MVC. Označeniu "Pohľad" sa budeme snažiť vyhýbať, pretože nekorešponduje s označením "V" a môže miasť. Neexistuje žiadna striktná definícia architektúry a tak sa môžeme stretnúť s viacerými výkladmi. Zameriame sa na ten najrozšírenejší.
Komponenty Model a Controler sú samozrejme triedy. View je HTML šablóna.
Model
Model obsahuje logiku aplikácie a všetko,
čo do nej spadá. Sú to okrem iného výpočty, databázové dopyty,
validácia a podobne. Model vôbec nevie o výstupe. Jeho
funkcia spočíva v prijatí parametrov zvonku a vydaní dát von. Zdôraznime,
že parametre nie sú URL adresa ani žiadne iné parametre od používateľa.
Model nevie, odkiaľ dáta v parametroch prišli a ani ako budú
výstupné dáta sformátované a vypísané.
Keďže budeme používať tzv. ORM (Objektovo-Relačné Mapovanie), naše
modely budú priamo korešpondovať s databázovými tabuľkami. Budeme teda
mať napr. model User, Comment alebo
Article. Inštancie modelov budú samozrejme obsahovať atribúty z
databázy. Inštancia modelu User bude mať napr. atribút
name. Triede môžeme definovať inštančné metódy, napr. takú,
ktorá vypočíta vek používateľa podľa jeho dátumu narodenia. Metódy
týkajúce sa všeobecne používateľov (teda triedne) často vkladáme do
modelu ako statické, napr. overenie správnej dĺžky a znakov hesla (teda jeho
validáciu, pretože heslo overujeme ešte predtým, ako je inštancia
používateľa vytvorená, a zároveň s používateľom logicky súvisí).
Teraz máme predstavu, čo model vykonáva, poďme sa pozrieť na pohľad.
View
Hoci sme sa s pojmom View v Django už stretli, v MVC architektúre má tento pojem iný význam. Teraz budeme teda hovoriť o všeobecnom komponente, nie o Django.
View sa stará o zobrazenie výstupu
používateľovi. Ide o HTML šablónu obsahujúcu
HTML stránku a tagy značkovacieho jazyka Django, ktorý
umožňuje do šablóny vkladať premenné, prípadne vykonávať iterácie
(cykly) a podmienky. View user teda vypíše detaily o
používateľovi, view article vypíše obsah článku a tak
ďalej.
View máme mnoho, napr. pre funkcionalitu s entitou používateľa:
user_registration, user_login,
user_profile a podobne. View user_profile je ale už
spoločný všetkým používateľom a sú do neho posielané rôzne dáta,
vždy podľa toho, koho práve zobrazujeme. Tieto dáta sú potom dosadené do
HTML elementov šablóny.
Šablóny je možné samozrejme vkladať do seba, aby sme sa neopakovali (šablóna s layoutom stránky, šablóna s menu a šablóna s článkom).
View nie je len šablóna, ale zobrazovač výstupu. Obsahuje teda len minimálne množstvo logiky, ktorá je pre výpis nutná (napr. kontrola, či si používateľ vyplnil prezývku pred jej vypísaním alebo cyklus s komentármi, ktoré sa vypisujú).
View podobne ako Model vôbec nevie, odkiaľ mu dáta prišli, stará sa len o ich zobrazenie používateľovi.
Controler
Controler je teraz ten chýbajúci prvok, ktorý osvetlí
funkčnosť celého vzoru. Jedná sa o akéhosi prostredníka,
s ktorým komunikuje používateľ, model aj view. Drží teda celý systém
pohromade a komponenty prepája. Jeho funkciu pochopíme z
ukážky životného cyklu stránky. Opäť existuje mnoho rôznych prístupov.
Najčastejšie má každá entita jeden controler, máme teda
UserControler, ArticleControler a tak podobne.
Životný cyklus stránky
Životný cyklus zahajuje používateľ, ktorý
zadá do prehliadača adresu webu a parametre,
ktorými nám oznámi, ktorú podstránku si praje zobraziť. Budeme chcieť
napr. zobraziť detail používateľa s id 15. URL adresa teda
bude:
Požiadavku ako prvú zachytí tzv. router. S tým sme sa
už zoznámili. Router podľa definovaných rout pozná, ktorý
controler voláme. V našom prípade voláme
UserControler.
Daný controler podľa parametrov pozná, čo sa od neho chce, teda že má zobraziť detail používateľa. Zavolá model, ktorý používateľa vyhľadá v databáze a vráti jeho údaje. Ďalej zavolá ďalšiu metódu modelu, ktorá napr. vypočíta vek používateľa. Tieto údaje si controler ukladá do premenných. Nakoniec vyrenderuje view. Názov view spoznáme podľa akcie, ktorú robíme. View sú odovzdané premenné s príslušnými dátami. Controler teda poslúchol používateľa, obstaral podľa parametrov dopytu dáta od modelu a odovzdal ich view.
View prijme dáta od controlera a vloží ich do pripravenej
šablóny. Hotová stránka je zobrazená používateľovi, ktorý často o
celej tejto kráse ani netuší 
Celú situáciu môžeme znázorniť diagramom:

Získali sme teda oddelenie logiky od výstupu, view sú ako HTML, modely zas v Pythone. Dosiahli sme prehľadnosť kódu, ktorý je logicky rozčlenený.
MVC architektúra nám uľahčuje aj myslenie pri vývoji projektu. Keď píšeme logiku, patrí do modelu, formátovania a štýlovania výstupu riešime v šablóne, to, čo používateľ chce z parametrov, zisťujeme v controleri. Tri rôzne problémy na troch rôznych miestach, oddelené tak, aby do seba nezasahovali a nerobili nám vývoj zložitejší.
MVT
Framework Django implementuje MVC architektúru presne tak, ako sme si ju popísali. Jednotlivé komponenty ale nazýva po svojom a bohužiaľ názov jednej používa na označenie odlišnej funkcionality, čo je povedzme si na rovinu mätúce:
- Modely - modelom hovorí Django Modely,
- Views - views hovorí Django Templates, čo je v preklade šablóny,
- Controlers - controlerom Django hovorí Views. Nenechajme sa teda zmiasť. Keď v našej Django aplikácii tvoríme nový View, nie je to HTML šablóna, ale daný prostredník medzi Modelom a Šablónou.
V minulej aplikácii sme svoje prvé view implementovali ako
metódu index(). Tá ešte nepoužívala model ani šablónu, iba
vrátila textovú odpoveď používateľovi.
V nasledujúcej lekcii, Kalkulačka vo frameworku Django , vytvoríme svoju prvú poriadnu webovú aplikáciu v Pythone. Pôjde o jednoduchú kalkulačku.

David sa informačné technológie naučil na