3. díl - Představení MVC a MVT architektury v Django

Python Django Představení MVC a MVT architektury v Django

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Seznámení s Django frameworkem pro Python, jsme si vytvořili svou první webovou aplikaci ve frameworku Django pro Python. Poprali jsme se s routováním a vypsali hlášku "Ahoj světe!". Než začneme uživateli servírovat opravdové HTML stránky, měli bychom si nejprve představit tzv. MVC architekturu, která se v téměř všech webových aplikacích používá.

MVC

MVC je velmi oblíbený architektonický vzor, který se uchytil zejména na webu, ačkoli původně vznikl na desktopech. Je součástí populárních webových frameworků, jakými jsou např. Zend nebo Nette pro PHP, Ruby On Rail pro Ruby nebo MVC pro ASP .NET. Osobně si bez něj (nebo nějakého podobného principu) nedokáži představit složitější web.

Motivace

Základní myšlenkou MVC architektury je oddělení logiky od výstupu. Řeší tedy problém tzv. "špagetového kódu", kdy máme v jednom souboru (třídě) logické operace a zároveň renderování výstupu. Soubor tedy obsahuje databázové dotazy, logiku (volání Python příkazů) a různě poházené HTML tagy. Vše je zamotané do sebe jako špagety.

Kód se samozřejmě špatně udržuje, natož rozšiřuje. Je špatně highlightovaný, protože si s ním IDE neví rady, HTML není správně naformátováno, ztrácíme se v jeho stromové struktuře. Naším cílem je, aby zdrojový kód s logikou vypadal jako zdrojový kód (Python) a výstup vypadal jako HTML stránka s co nejmenší příměsí dalšího kódu.

Komponenty

Celá aplikace je rozdělena na komponenty 3 typů, hovoříme o Modelech, View (pohledech) a Controllerech (kontrolerech), od toho MVC. Označení pohled se budu snažit vyhýbat, protože mi přijde matoucí, že takto přeložené nekoresponduje s označením V. Neexistuje žádná striktní definice architektury a tak se můžete setkat s více výklady. Zaměřil jsem se na ten nejrozšířenější.

Komponenty Model a Controller jsou samozřejmě třídy. View je HTML šablona.

Model

Komponenta model z MVC architektury Model obsahuje logiku a vše, co do ní spadá. Mohou to být výpočty, databázové dotazy, validace a podobně. Model vůbec neví o výstupu. Jeho funkce spočívá v přijetí parametrů zvenku a vydání dat ven. Zdůrazním, že parametry nemyslím URL adresu ani žádné jiné parametry od uživatele. Model neví, odkud data v parametrech přišla a ani jak budou výstupní data zformátována a vypsána.

Jelikož budeme používat tzv. ORM (Objektově-Relační Mapování), naše modely budou přímo korespondovat s databázovými tabulkami. Budeme tedy mít např. model Uzivatel, Komentar nebo Clanek. Instance modelů budou samozřejmě obsahovat atributy z databáze. Instance modelu Uzivatel bude mít např. atribut jméno. Třídě můžeme definovat instanční metody, např. takovou, která vypočítá věk uživatele podle jeho data narození. Metody týkající se obecně uživatelů (tedy třídní) často vkládáme do modelu jako statické, např. ověření správné délky a znaků hesla (tedy jeho validaci, protože heslo ověřujeme ještě předtím, než je instance uživatele vytvořena a zároveň s uživatelem logicky souvisí).

Nyní máme představu, co model vykonává, pojďme se podívat na pohled.

View

Ačkoli jsme se s pojmem "View" v Django setkali již minule, v MVC architektuře má tento pojem jiný význam. Nyní budeme tedy mluvit o obecné komponentě, ne o Django.

Komponenta view z MVC architektury Pohled (View) se stárá o zobrazení výstupu uživateli. Jedná se o html šablonu, obsahující HTML stránku a tagy značkovacího jazyka Djanga, který umožňuje do šablony vkládat proměnné, případně provádět iterace (cykly) a podmínky. Pohled uzivatel tedy vypíše detaily o uživateli, pohled clanek vypíše obsah článku.

Pohledů máme mnoho, např. pro funkcionalitu s entitou uživatele: uzivatel_regis­trace, uzivatel_prih­laseni, uzivatel_profil a podobně. Pohled uzivatel_profil je ale již společný všem uživatelům a jsou do něj posílána různá data, vždy podle toho, koho zrovna zobrazujeme. Tato data jsou poté dosazena do HTML elementů šablony.

Šablony lze samozřejmě vkládat do sebe, abychom se neopakovali (šablona s layoutem stránky, šablona s menu a šablona s článkem).

View není jen šablona, ale zobrazovač výstupu. Obsahuje tedy minimální množství logiky, která je pro výpis nutná (např. kontrola, zda si uživatel vyplnil přezdívku před jejím vypsáním nebo cyklus s komentáři, které se vypisují).

View podobně jako Model vůbec neví, odkud mu data přišla, stará se jen o jejich zobrazení uživateli.

Controller

Komponenta controller z MVC architektury Controller je nyní onen chybějící prvek, který osvětlí funkčnost celého vzoru. Jedná se o jakéhosi prostředníka, se kterým komunikuje uživatel, model i view. Drží tedy celý systém pohromadě a komponenty propojuje. Jeho funkci pochopíme z ukázky životního cyklu stránky. Opět existuje mnoho různých přístupů, nejčastěji má každá entita jeden controller, máme tedy UzivatelController, ClanekController a tak podobně.

Životní cyklus stránky

Životní cyklus zahajuje uživatel, který zadá do prohlížeče adresu webu a parametry, kterými nám sdělí, kterou podstránku si přeje zobrazit. Budeme chtít zobrazit detail uzivatele s id 15. Udělejme si ukázku URL adresy:

http://www.domena.cz/uzivatel/detail/15

Požadavek jako první zachytí tzv. router. S routy jsme se již seznámili. Ten podle definovaných rout pozná, který controller voláme. V našem případě voláme UzivatelController.

Daný controller podle parametrů pozná, co se po něm chce, tedy že má zobrazit detail uživatele. Zavolá model, který uživatele vyhledá v databázi a vrátí jeho údaje. Dále zavolá další metodu modelu, která např. vypočítá věk uživatele. Tyto údaje si controller ukládá do proměnných. Nakonec vyrenderuje view (pohled). Název pohledu poznáme podle akce, kterou provádíme. View jsou předány proměnné s příslušnými daty. Controller tedy poslechl uživatele, obstaral podle parametrů dotazu data od modelu a předal je view.

View přijme data od controlleru a vloží je do připravené šablony. Hotová stránka je zobrazena uživateli, který často o celé této kráse ani netuší :)

Celou situaci můžeme znázornit diagramem:

MVC architektura

Získali jsme tedy oddělení logiky od výstupu, view jsou jako HTML, modely zas v Pythonu. Dosáhli jsme přehlednosti kódu, který je logicky rozčleněný.

MVC architektura nám usnadňuje i myšlení při vývoji projektu. Když píši logiku, patří do modelu, formátování a stylování výstupu řeším v šabloně, to co uživatel chce z parametrů zjišťuji v controlleru. 3 různé problémy na 3 různých místech, oddělené tak, aby do sebe nezasahovaly a nedělaly nám vývoj složitější.

MVT

Framework Django implementuje MVC architekturu přesně tak, jak jsme si ji popsali. Jednotlivé komponenty ale nazývá po svém a bohužel název jedné prohodil, což může být matoucí.

  • Modely - Modelům říká Django Modely.
  • Views - Pohledům říká Django Templates, což je v překladu šablony.
  • Controllers - Kontrolerům Django říká Views. Nenechte se tedy zmást. Když v naší Django aplikaci tvoříme nový View, není to HTML šablona, ale onen prostředník mezi Modelem a Šablonou. V minulé aplikaci jsme své první view implementovati jako metodu index(). Ta ještě nepoužívala model ani šablonu, ale pouze vrátila textovou odpověď uživateli.

V příští lekci, Kalkulačka v Django frameworku, vytvoříme svou první pořádnou webovou aplikaci v Pythonu. Prozradím, že půjde o jednoduchou kalkulačku.


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
2 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Všechny články v sekci
Django framework pro Python
Miniatura
Následující článek
Kalkulačka v Django frameworku
Aktivity (1)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!