3. diel - Predstavenie MVC a MVT architektúry v Django
V minulej lekcii, Zoznámenie s Django frameworkom 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, predstavíme si v dnešnom tutoriáli webových aplikácií s frameworkom Django 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žuje, 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čenie "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é dotazy,
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žiadavka 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 po ňom 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 dotazu 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 štylovania 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 povedzme si na rovinu je 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 onen 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, ale
iba vrátila textovú odpoveď používateľovi.
V budúcej lekcii, Kalkulačka v Django frameworku, vytvoríme svoju prvú poriadnu webovú aplikáciu v Pythone. Pôjde o jednoduchú kalkulačku.