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 "Ahoj svete!".
Než začneme uží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 MVC pre ASP .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é otázky, 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 oi výpočty, databázové otázky, 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 uží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 Uzivatel
, Komentar
alebo
Clanek
. Inštancie modelov budú samozrejme obsahovať atribúty z
databázy. Inštancia modelu Uzivatel
bude mať napr. atribút
jmeno
. Triede môžeme definovať inštančné metódy, napr.
takú, ktorá vypočíta vek užívateľa podľa jeho dátumu narodenia. Metódy
týkajúce sa všeobecne uží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
užívateľa vytvorená, a zároveň s uží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 uží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
uzivatel
teda vypíše detaily o užívateľovi, view
clanek
vypíše obsah článku a tak ďalej.
View máme mnoho, napr. pre funkcionalitu s entitou užívateľa:
uzivatel_registrace
, uzivatel_prihlaseni
,
uzivatel_profil
a podobne. View uzivatel_profil
je ale
už spoločný všetkým uží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 uží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 uží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 UzivatelControler
,
ClanekControler
a tak podobne.
Životný cyklus stránky
Životný cyklus zahajuje uží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 uží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
UzivatelControler
.
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 uží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 uží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á uží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.
index()
. Tá ešte nepoužívala model ani šablónu, ale iba
vrátila textovú odpoveď uží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.