Django
Django je open source webový aplikační framework napsaný v Pythonu, který se volně drží architektury Model-view-controller. Původně bylo navrženo pro správu několika zpravodajsky orientovaných stránek společnosti The World Company v Lawrenci v Kansasu, později, v červnu 2005, bylo vydáno veřejně pod open-sourceovou licencí BSD. Framework byl pojmenován po jazzovém kytaristovi Django Reinhardtovi.
Vývojář | Django Software Foundation |
---|---|
První vydání | 21. července 2005 |
Aktuální verze | 4.0.4 (11. dubna 2022) |
Vyvíjeno v | Python |
Typ softwaru | webový framework |
Licence | BSD licence |
Web | www.djangoproject.com |
Některá data mohou pocházet z datové položky. |
Je dalším z řady webových frameworků, jako je např. Ruby on Rails. Oproti Ruby on Rails však nabízí zajímavou možnost automatické tvorby administrace projektu, která je generována dynamicky podle datového modelu.
Hlavní úkol Djanga je snadné vytvoření komplexních, databází řízených webových aplikací. Zaměřuje se na znovupoužitelnost a propojitelnost komponent, rychlý vývoj, vždy v duchu „DRY“ (Don’t Repeat Yourself) – neopakovat se.
Komponenty
Jádro frameworku Django obsahuje objektově-relační mapper, který je zprostředkovatelem mezi datovým modelem (definovaným jako třídy Pythonu) a relační databází; systémem zobrazení pro zpracování požadavků a šablonovacím systémem.
Framework navíc nabízí:
- Odlehčený, samostatný webový server pro vývoj a testování.
- Serializační a validační systém pro formuláře, který automaticky překládá data mezi formulářem HTML a hodnotami vyhovujícími databázi.
- Cachovací framework, který nabízí několik různých metod cachování.
- Podporu tříd, které mohou zasáhnout v různých stádiích vyřizování požadavku a provést vlastní funkce.
- Vnitřní komunikační systém pro komunikaci mezi komponentami pomocí předem dohodnutých signálů.
- Možnost překladu všech komponent do libovolného jazyku.
- Serializační systém, který může produkovat nebo číst reprezentaci XML a/nebo JSON instancí modelu Django.
- Systém rozšiřujících schopností šablonovacího enginu.
Struktura projektu
Django je framework, který ponechává většinu rozhodnutí na programátorovi aplikace, lze použít jakoukoliv podmnožinu nabízené funkcionality. Vhodnou podmnožinu funkcionality je možné aplikovat i na vývoj desktopových aplikací.
Projekt je chápán jako nejvyšší úroveň v Djangu, je charakterizován konfiguračním souborem settings.py. Podle názvu je patrné, že se jedná o obyčejný modul v Pythonu. Tento konfigurační soubor je společný všem aplikacím v Djangu. Tento soubor je možno vytvořit ručně nebo skriptem. Díky možnosti vytvářet struktury projektu a aplikací jednoduchým skriptem není potřeba používat sofistikovanější integrované vývojové prostředí (IDE). Programátor si pohodlně vystačí s obyčejným textovým editorem s podporou zvýrazňování syntaxe. Standardní postup pro vytvoření projektu skriptem po instalaci knihovny Django do lokální instalace Pythonu je: 1. Zkopírování scriptu django-admin.py z lokální instalace Pythonu do adresáře s projekty. 2. Vytvoření projektu z příkazové řádky příkazem: python django-admin.py startproject (název projektu).
V druhém bodě je vytvořen adresář v aktuálním pracovním adresáři s názvem projektu. Adresář bude obsahovat následující soubory:
- manage.py – Script, který má na starosti správu projektu. Mezi jeho základní úlohy patří:
- vytvoření základní struktury nové aplikace,
- vytvoření databázového schématu,
- spouštění testovacího webového serveru,
- spouštění jednotkových testů.
- settings.py – Konfigurační script společný všem aplikacím v projektu obsahuje zejména:
- konfiguraci databázového připojení,
- konfiguraci připojení k SMTP serveru pro snadné posílání emailů,
- konfiguraci tzv. Middleware (rozebráno dále v kapitole Middleware),
- nastavení časového pásma a lokále aplikace,
- registraci aplikací do projektu.
- urls.py – Globální konfigurace URL. V tomto souboru jsou URL přesměrována na konkrétní view.
- __init__.py – Adresář projektu je díky tomuto souboru také balíčkem Pythonu.
Konfigurační soubor se vygeneruje plně okomentovaný, takže i úplnému začátečníkovi v práci s touto knihovnou bude jasný význam jednotlivých konfiguračních klíčů. V tuto chvíli už je dostupný příkaz pro spuštění testovacího serveru, takže lze vyzkoušet python manage.py runserver a po přistoupení na URL http://localhost:8000, už je vidět úvodní stránka. Začít vytvářet aplikaci je možné jen v případě, že již máme založený nějaký projekt. Aplikace v Djangu jsou vždy součástí projektu, jedna aplikace může být součástí i více projektů. Je ovšem důležité, aby interpret Pythonu našel zaregistrovaný modul aplikace. Aplikace jsou tedy jednotlivými komponentami v systému, které mohou mít mezi sebou závislosti. Django v těchto případech nezavádí žádnou magii na pozadí, jen podporuje to, co už umí Python standardně. Vytvoření struktury nové aplikace proběhne po spuštění: python manage.py startapp (název aplikace). Po spuštění tohoto scriptu se vytvoří v aktuálním pracovním adresáři adresář název aplikace s následující strukturou:
- views.py – Obsahuje jednotlivé view funkce.
- urls.py – Obsahuje mapování URL na jednotlivá view.
- models.py – Obsahuje popis datového modelu aplikace.
- tests.py – Obsahuje jednotkové testy.
- __init__.py – Dělá z aplikace balíček Pythonu.
Každá aplikace musí být zaregistrována v settings.py v položce INSTALLED_APPS. Poté je možné spravovat aplikaci pomocí scriptu manage.py a využívat tak všechny standardní funkce, které Django nabízí. V případě většího zájmu o bližší seznámení s jednotlivými soubory se doporučuje navštívit oficiální dokumentaci.
Zpracování požadavku
Požadavek je v Djangu reprezentován jako instance třídy HttpRequest. V tomto objektu jsou zpřístupněna metadata o HTTP požadavku prostřednictvím jeho atributů a metod. Stručný přehled atributů třídy HttpRequest:
- method – Textový řetězec, který reprezentuje HTTP metodu požadavku (GET, POST, OPTIONS atd.).
- path – Cesta k požadované stránce.
- GET – Atributy poslané v URL.
- POST – Atributy poslané v těle požadavku.
- REQUEST – Obecný přístup k atributům.
- COOKIES – Cookies posílané HTTP požadavkem.
- FILES – Soubory k uploadování.
- META – Obsahuje všechny dostupné HTTP hlavičky.
- user – Objekt autentizovaného uživatele.
Odpověď reprezentuje instance třídy HttpResponse. Tento objekt má možnost vyplnit všechny odpovědní hlavičky HTTP protokolu.
Mezi přijetím požadavku a odesláním odpovědi z konkrétního view projde požadavek přes řetěz tzv. middleware. V této knihovně je však chápání pojmu middleware odlišné od běžného pojetí. Zde jsou třídy middleware chápány obdobně jako filter v Java Servlet API. Naprosto zřejmě se jedná o aplikaci návrhového vzoru Chain of Responsibility. Úlohou tohoto návrhového vzoru je vyhnutí vázání odesílatele a příjemce zprávy za použití řetězu objektů, které mohou odpovědět. Django používá k zachycování požadavků tzv. view funkce. Tato funkce je namapována na konkrétní url. Standardním způsobem je právě definování view jako samostatných funkcí, ale díky flexibilitě jazyka Python lze použít view namapovaná i z existující instance objektu.
Šablonovací systém
Po zpracování požadavku ve funkci je výhodné používat vestavěný šablonovací systém. Šablona je zde obyčejný textový soubor, který díky speciálním značkám umožňuje vypsat text z modelu daného pro vykreslování. Modelem se rozumí instance třídy Context, která se konstruuje ze slovníkového objektu. Tento šablonovací systém je velice flexibilní a umožňuje snadno dopisovat vlastní rozšíření. Další jeho velkou výhodou je umožnění dědičnosti šablon. Tato dědičnost umožňuje v potomkovi předefinovat či rozšířit sekce definované v předkovi. Sekce se definují takto:
- začátek sekce {% block nazev_sekce %}
- konec sekce {% endblock %}
Objektově relační mapování
Další velice silnou součástí Djanga je jeho objektově relační mapování. Každý model je potomkem třídy Model z modulu django.db. Jedná se o implementaci návrhového vzoru ActiveObject. Každá třída má automaticky jedno pole a tím je id. Toto pole slouží k identifikaci konkrétního objektu v databázi. Využit je zde dynamický princip Pythonu a za běhu jsou modely rozšířeny o API pro práci s metadaty. Další pole definuje uživatel, je možno využít jak předefinovaných databázových typů polí, nebo lze implementovat i vlastní.
from django import model as m
class Adresa(m.Model):
ulice = m.CharField(max_length=60)
mesto = m.CharField(max_length=60)
psc = m.PositiveIntegerField(blank=True,null=True)
class Osoba(m.Model):
titul = m.CharField(max_length=10,blank=True,null=True)
jmeno = m.CharField(max_length=30)
prijmeni = m.CharField(max_length=30)
rodne_prijmeni = m.CharField(max_length=30,blank=True,null=True)
rodne_cislo = m.CharField(max_length=45,blank=True,null=True)
email = m.EmailField(blank=True, null=True)
adresa = m.ForeignKey(Adresa)
Práce s těmito objekty probíhá velice intuitivně. V kódu je vidět ukázka jednoduché definice objektů. Tyto objekty lze vybírat z databáze jak s použitím, tak i bez použití SQL.
Server
Framework Django může fungovat na Apache 2 s mod python nebo pod jakýmkoli webovým serverem vyhovujícím WSGI. Django je také schopno spouštět server FastCGI v pozadí webového serveru, který podporuje FastCGI.
Framework Django oficiálně podporuje následující databáze:
Adaptéry pro Microsoft SQL Server a Oracle jsou ve vývoji a jsou stále experimentální.