Django open-source web framework

17. December, 2010, Autor článku: Gallovič Tomáš, Informačné technológie, Študentské práce
Ročník 3, číslo 12 Share on Facebook This page as PDF Pridať príspevok

S príchodom dynamického obsahu web stránok prišiel aj úžasný rozmach jazyka PHP. Prispela k tomu rýchlosť výučby, jednoduchosť nasadenia na server z dôvodu množstva ponúkaných webhostingových služieb, široká základňa vývojárov a s nimi aj dostupnosť vzdelávacích materiálov a fragmentov kódu. Samozrejme, ako všetko, aj tento jazyk má svoje úskalia. Jeho jednoduché použitie môže podporovať nedbalý, zle navrhnutý a opakujúci sa kód. Napríklad aj tieto dôvody viedli k vývoju web frameworkov. Dnes si jeden takýto, postavený na jazyku Python predstavíme.

Django vzniklo v roku 2003 v Kansase ako open-source projekt, kde vznikla potreba v extrémne krátkom čase vyvíjať plne funkčné webové aplikácie a tak v roku 2005 uzrela svetlo sveta prvá verzia tohto frameworku. Mimochodom je pomenovaná podľa svetoznámeho jazzového gitaristu Djanga Reinharta.

Filozofia Django frameworku

  • Menej kódu – čím viac kódu, tým viac chýb. To znamená, že by sme mali množstvo kódu minimalizovať, čím sa v konečnom dôsledku urýchli aj vývoj.
  • Menej duplicít (Don’t Repeat Yourself DRY) – okrem toho, že sa týmto spôsobom zredukuje množstvo kódu lebo každá funkcionalita aplikácie je len na jednom mieste, takisto to prispeje aj k sprehľadneniu celej aplikácie. To oceníte pri jej neskorších úpravách a opravách.
  • Lepšie explicitne ako implicitne – ináč povedané, framework by nemal robiť veľa komplikovaných trikov poza chrbát vývojára. Čiže ak máte potrebu zmeniť niečo v samotnom jadre frameworku, nemal by to byť problém.
  • Konzistencia – ak framework používa jednu myšlienku na jednej úrovni, mal by ju dodržiavať všade, teda ak viete ako funguje jeden princíp, učenie sa iných už potom nebude také náročné ak si sú podobné.
  • Málo väzieb – účelom tejto myšlienky je, aby bol každý prvok frameworku čo možno najviac nezávislý od iných. Tento princíp dovoľuje jednoducho meniť celé časti kódu a ich nahradzovanie inými.

Ako funguje Django

Django využíva návrhový vzor MVC, aj keď ho interpretuje po svojom a teda mierne odlišne. Tento princíp pracuje s tromi vrstvami:

  • dátový model – táto vrstva pracuje s dátami a so všetkým čo s nimi súvisí. Čiže prístup k nim, ich validáciu, vzťahy medzi nimi.
  • pohľad – túto vrstvu zastupuje v Django frameworku templatovací systém a funkcie rozhodujúce ktorý template sa má použiť na zobrazenie ktorých údajov. Tieto funkcie sa nazývajú views.
  • controler – táto vrstva má na starosti riadiacu logiku, ide o mapovanie url adries ku konkrétnym funkciám.

Ako vie Django spríjemniť vývoj

Objektovo-relačné mapovanie databázy (ORM)

Moderné webové aplikácie vyžadujú interakciu s databázou. V princípe je to najčastejšie pripojenie k databáze, výber dát a ich zobrazenie v nejakom formáte. Ak nepoužívame nejakú databázovú abstrakciu, chtiac nechtiac sa pripútavame ku konkrétnej databáze, ku konkrétnym štruktúram tabuliek a tak ďalej.

Problém nastáva ak chceme zmeniť štruktúru niektorej tabuľky alebo dokonca zmeniť celú databázu napríklad MySQL za PostgreSQL. Takáto zmena znamená veľa úprav v kóde a vysoké riziko nejakej neobjavenej chyby. Django rieši tento problém tak, že vývojár definuje každú tabuľku databázy ako samostatnú triedu, a na manipuláciu s dátami používa metódy triedy. Napríklad tabuľka v SQL reprezentujúca osobu by vyzerala takto:

CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);

a tá istá tabuľka v Django modeli:

class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)

Takýmto spôsobom sa pri zmene štruktúry niektorej z tabuliek upravia len atribúty triedy, ktorá ju reprezentuje a zvyšok kódu nie je potrebné meniť.

Autentifikácia a autorizácia

Používatelia majú mená ,heslá, emaily, práva, chcú sa prihlasovať, odhlasovať, meniť si profil a všeličo iné. Po pár aplikáciách si každý vývojár povie, zas autentifikovať a autorizovať. Už netreba, Django obsahuje modul, ktorý sa o požívateľov postará.

Automatické administračné rozhranie

Toto rozhranie je dnes už bežnou súčasťou väčšiny moderných webových aplikácií, to pre nás vývojárov znamená, že ho musíme zakaždým tvoriť a to je väčšinou nudná záležitosť. Musíme zobraziť položky, ponúknuť možnosti ich editácie, zmazanie alebo vytvorenia nových. Stále tieto 4 aktivity dookola. A Django nám ho vie spraviť za nás. Na základe nášho dátového modelu vygeneruje rozhranie a vďaka modelu autentifikácie a autorizácie dovolí prístup len povereným a overeným osobám.

Validácia formulárov

Kontrola vstupov od používateľov znamená skontrolovať formát údajov, ak nie je správny zobraziť chybovú správu a prípadne si znovu vyžiadať údaje. Ďalší zaužívaný stereotyp, Django zas podáva pomocnú ruku, a validuje údaje samo na základe dátového modelu.

Elegantný dizajn url

Jednoduché , čisté a elegantné, také by mali byť url adresy webovej aplikácie, a nemali by sa časom meniť. Samozrejme nejde len o estetickú stránku veci, dizajn url napomáha aj pri efektívnom SEO. Ako sme si už spomínali Djnago používa akési mapovanie medzi url adresou a funkciou, ktorá sa pri jej zavolaní spustí. Takto máme plnú kontrolu nad url adresami.

Template systém

Snahou pri čistom programovaní je oddeliť kód od dizajnu. Je tomu tak preto, že dizajn ma tendenciu sa meniť častejšie ako kód. Takisto je vysoko efektívne, ak môže súčasne pracovať vývojár na kóde a dizajnér na vzhľade. Preto Django používa svoj vlastný templatovací systém. V tomto systéme je možné použiť dedenie šablón, vytvárať vlastné tagy, filtrovať dáta a mnoho ďalších vecí.

Praktická ukážka

Hovorí sa, že raz vidieť je viac ako sto krát počuť. Vytvoríme si jednoduchú aplikáciu na správu článkov. Budeme v nej evidovať názov a obsah článku, ukážeme si ako zapísať a zobraziť údaje z databázy. Pokiaľ ide o stiahnutie a inštaláciu, nebudeme sa jej bližšie venovať. Najprv je potrebné nainštalovať python http://www.python.org/download/ a potom samotný Django framework http://www.djangoproject.com/download/.

Vytvorenie projektu

Projekt vytvoríme príkazom z konzoly.

$ django-admin.py startproject Clanky

Tento príkaz nám vygeneruje adresárovú štruktúru celého projektu. Django má zaujímavú hierarchiu vo vnútri projektu. Každý projekt sa skladá z takzvaných aplikácií (app), z ktorých každá má na starosti jednu logicky oddeliteľnú a ucelenú časť projektu. Vďaka tomuto spôsobu separácie jednotlivých častí, je neskôr možné ich medzi projektmi meniť a znovu používať.

Nakoľko je naša ukážka veľmi jednoduchá, bude nám stačiť jeden app. Ten vytvoríme tak, že sa v adresárovej štruktúre presunieme do novovytvoreného projektu a spustíme príkaz na vytvorenie appu.

$ cd Clanky
$ python manage.py startapp clankyapp

Tak a projekt je na svete. Ďalšou pomôckou zo strany Django frameworku je server na ktorom môžeme náš projekt pri vývoji testovať a ladiť na svojom počítači. Spustíme ho z konzoly.

$ python manage.py runserver

Tento server sa automaticky pri akejkoľvek zmene v kóde reštartuje. Výsledok našej doterajšej práce si môžeme pozrieť v prehliadači na http://localhost:8000/ .

Keďže chceme mať články v našej ukážke perzistentné, použijeme na ich uskladnenie databázu, Pre jednoduchosť použijeme sqlite. Ak ju nemáte nainštalovanú tu nájdete všetko potrebné: http://www.sqlite.org/download.html.

Aby sme Django frameworku povedali akú databázu má použiť, nastavíme v súbore settings.py tieto hodnoty:

DATABASE_ENGINE = ‘sqlite3’‚
DATABASE_NAME = ‘data.db’
TEMPLATE_DIRS = ( "/clankyapp/templates",)
INSTALLED_APPS = (... , 'Clanky.clankyapp',)

Samotný článok bude v našej aplikácií reprezentovať trieda Clanok. Vďaka tomu, že našpecifikujeme túto triedu aj s jej atribútmi, framework bude vedieť akú tabuľku v databáze ma vytvoriť pre uloženie článkov. Triedu zadefinuje v súbore clankyapp/models.py.

from django.db import models

class Clanok(models.Model):
nazov = models.CharField(max_length=30, unique=True)
text = models.TextField(blank=True)

Nasledujúcim príkazom sa v databáze vytvoria tabuľky podľa tried zadefinovaných vo všetkých súboroch models.py v rámci celého projektu.

$ python manage.py syncdb

Budeme požívať dve url adresy, jednu na zobrazenie všetkých článkov a jednu na pridávanie nových. Tieto adresy zadefinujeme v súbore clankyapp/urls.py (je potrebné ho najprv vytvoriť). Tam povieme ktorý pohľad sa má zavolať po pristúpení na konkrétnu adresu.

from django.conf.urls.defaults import *
from clankyapp.views import index, new
urlpatterns = patterns('', (r'^$', index), (r'^new/$', new))

V súbore pre mapovanie url adries a pohľadov pre celý projekt urls.py musíme povedať, nech sa berie do úvahy aj clankyapp/urls.py.

urlpatterns = patterns('', (r'^', include('clankyapp.urls')), )

Teraz sa pri požiadavke na adresu localhost:8000/ spustí pohľad s názvom index a pri požiadavke na adresu localhost:8000/new sa spustí pohľad new. Mierne predbehneme, a pripravíme si triedu, pomocou ktorej sa postaráme o vstup od používateľa pri vytváraní nových článkov. Ako som už vyžšie spomínal, framework sa o velidáciu formulárov postará za nás. Stačí povedať formulár k akému objektu chceme. Vytvoríme súbor clankyapp/forms.py s takýmto obsahom.

from django import forms
from clankyapp.models import Clanok

class ClanokForm(forms.ModelForm):
class Meta:
model = Clanok

Konečne sa dostávame k samotnej funkcionalite. Tú zadefinujeme v súbore clankyapp/views.py. Vytvoríme v ňom dva pohľady. Pohľad index vyberie všetky objekty typu Clanok a naplní nimi template index.html. Pohľad new v prípade že prídu od používateľa nejaké dáta, skontroluje ich a ak sú právne tak uloží nový článok a presmeruje používateľa na prehľad všetkých článkov. Ak od používateľa žiadne dáta neprídu, zobrazí prázdny formulár.

from clankyapp.forms import ClanokForm

def index(request):
clanky=Clanok.objects.all()
return render_to_response("index.html",{"clanky":clanky})

def new(request):
if request.method == 'POST':
form = ClanokForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect("/")
else:
form = ClanokForm()
return render_to_response("addform.html",{'form': form})

Nakoniec vytvoríme template pre každý pohľad. Django framework na to používa vlastný jazyk. Hodnoty premenných sa zapisujú v zdvojených zátvorkách takto: {{ premenna }}. V tomto jazyku môžeme používať aj preddefinované alebo vlastné tagy. Tie sa zapisujú takto: {% tag %} a slúžia napríklad aj na iteráciu alebo vetvenie ako je vidieť v našom príklade.

clankyapp/templates/index.html
<h3>Clanky</h3>
<ul>
{% for clanok in clanky %}
<li>
{{clanok.nazov}} {{clanok.text}}
</li>
{% endfor %}
</ul>
<a href="/new">pridat clanok</a>


clankyapp/templates/addform.html
<form action="" method="post">
{{form.as_p}}
<input type="submit" value="pridaj" />
</form>

Naša aplikácia je týmto hotová. Prajem Vám veľa ušetreného kódu a času, pretože menej je s frameworkom Django viac.


Zdrojové súbory k článku

Napísať príspevok