Přejít k navigační liště

Zdroják » Různé » Django: Nastavení projektu a první pokusy

Django: Nastavení projektu a první pokusy

Články Různé

Dnes si projdeme nastavení vytvořeného projektu a vyzkoušíme si rozběhat svou první aplikaci. K tomu budeme potřebovat přidat položku do seznamu URL, nějaký jednoduchý pohled a šablonu.

Nastavení projektu

V adresáři projektu, který jsme si minule založili, se nalézá soubor settings.py. Nejedná se o konfigurační soubor v klasickém slova smyslu, je to normální pythonový skript obsahující konstanty s nastavením. A na ty se teď podíváme. Stačí si soubor otevřít v libovolném textovém editoru.

Jaké kódování používat? Rozhodně UTF-8. Django s ním počítá jako s výchozím, avšak Python ne. Proto je potřeba na první nebo druhý řádek každého pythonového souboru (to jsou ty s příponou .py) napsat magický komentář  # coding: utf-8.

Přehled všech možností konfigurace lze nalézt v oficiální dokumentaci. Teď si nastavíme pouze ty konstanty, které budou v tomto díle seriálu potřeba, u ostatních ponecháme výchozí nastavení. Konkrétně se jedná o umístění adresáře se statickými soubory a s šablonami. Ty si nejprve vytvoříme v adresáři projektu. Obvykle se adresář pro statické soubory jmenuje static a ten pro šablony templates. Jakmile je máme vytvořené, stačí přepsat řádky s příslušnými konstantami na nové hodnoty:

MEDIA_ROOT = '/home/dqd/hrajeme_si/static/'

MEDIA_URL = '/static/'

TEMPLATE_DIRS = (
    '/home/dqd/hrajeme_si/templates/',
) 

Konstantu MEDIA_ROOT je potřeba nastavit na absolutní cestu k adresáři se statickými soubory. Související konstanta MEDIA_URL odkazuje na webovou adresu toho stejného adresáře, která se bude používat v HTML kódu projektu. A poslední nastavení, TEMPLATE_DIRS, obsahuje absolutní cesty k adresářům se šablonami. Těch může být víc, my se zatím spokojíme s jedním. Vzhledem k tomu, že zřejmě nemáte projekt ve stejném adresáři jako já, budete muset konstanty MEDIA_ROOT a TEMPLATE_DIRS nastavit trochu jinak.

Pokud Django provozujete na operačním systému Windows, oddělujte adresářovou strukturu pomocí běžných (dopředných) lomítek. Tedy například soubor C:UsersUživa­telsoubor.txt zapíšeme do konfigurace jako  'C:/Users/Uživatel/soubor.txt'.

Naše první aplikace

Minulý týden jsem sliboval, že si něco naprogramujeme. S programem vypisujícím aktuální čas sice díru do světa neuděláme, ale každý musí nějak začínat.

Založení aplikace

První krok spočívá v založení aplikace. Aplikace je součást projektu, která nám poskytuje nějakou funkcionalitu. Například tady na Zdrojáku by jedna aplikace mohla obsluhovat články a zprávičky, jiná aplikace by zajišťovala registraci, uživatelský profil a jeho správu. Jeden projekt obvykle obsahuje více aplikací. Stejně tak se jedna aplikace může vyskytovat ve více projektech.

Příkaz pro založení aplikace je python manage.py startapp <nazev_aplikace>. Pokud tedy chceme založit například aplikaci s názvem pokus, napíšeme příkaz python manage.py startapp pokus. Poté se vytvoří adresář stejného jména, obsahující několik souborů:

$ ls pokus/
__init__.py  models.py  tests.py  views.py 

Ahoj, světe!

Následující kód napíšeme do souboru views.py, který je určen pro zpracovávání dat pomocí pohledů (views). Náš první pokus o vypsání aktuálního času by mohl vypadat nějak takhle:

from datetime import datetime
from django.http import HttpResponse

def current_time(request):
    return HttpResponse(datetime.now().strftime('%H:%M:%S'))

První dva řádky importují z modulu datetime stejnojmennou třídu a z modulu django.http třídu HttpResponse, takže jsou připraveny k použití. Dále si definujeme funkci (tedy pohled) current_time, která má jediný parametr, objekt request. Všechny pohledy mají první parametr stejný a je konvence ho tak pojmenovávat. Objekt request (instance třídy HttpRequest) obsahuje užitečné informace týkající se HTTP dotazu, jako GET a POST parametry, proměnné serveru apod. Přehled všech možností tříd HttpRequest a HttpResponse lze nalézt v dokumentaci.

V posledním řádku kódu vrátíme HTTP odpověď. Zavoláním metody datetime.now() získáme aktuální datum a čas a pomocí další metody strftime jej zobrazíme ve tvaru hodiny:minuty:se­kundy. To vytvoří řetězec s aktuálním časem.

Ale to není vše, potřebujeme ještě přiřadit našemu pohledu adresu. Konstanta ROOT_URLCONF odkazuje na hlavní soubor s definicemi propojení URL s konkrétními pohledy. Ve výchozím nastavení se jedná o soubor urls.py, který nalezneme v adresáři projektu. Vymažeme jeho obsah a vložíme tam následující kód:

from django.conf.urls.defaults import *

urlpatterns = patterns('hrajeme_si',
    (r'^time/$', 'pokus.views.current_time'),
)

Opět je zde import důležitých součástí, hlavně funkce patterns. Tato funkce bere jako první parametr prefix, ze kterého se budou načítat pohledy (v našem případě projekt hrajeme_si) a další parametry jsou už jenom n-tice, obsahující regulární výraz s adresou a samotný pohled. Znak stříšky v regulárním výrazu označuje, že odkaz musí daným textem začínat, znak dolaru označuje, že tím musí končit. Počáteční lomítko se vynechává, protože všechny adresy začínají lomítkem. Tedy odkaz na index webu (/) by se zapsal regulárním výrazem  r'^$'.

Pohled se zadává ve formě podobné adresářové struktuře, jenom se místo lomítek odděluje tečkami a vynechávají se pythonové koncovky. Zápis 'hrajeme_si.pokus.views.current_time' by tedy znamenal projekt hrajeme_si, aplikace pokus, soubor views.py a funkce current_time.

Když soubory uložíme a nastartujeme vývojový server (příkaz python manage.py runserver), zobrazí se nám na adrese http://127.0.0.1 :8000/time/ aktuální čas.

Značkování podle šablony

Předchozí příklad vrací odpověď ve formě prostého textu. Samozřejmě bychom mohli začít vkládat HTML tagy přímo do pohledu, ale to odporuje principu oddělení dat od jejich prezentace. (Vzpomínáte si na zmínku o MTV architektuře v minulém dílu? Tohle je přesně ono.) Proto si raději založíme HTML šablonu, které přepošleme objekt s aktuálním časem a čas naformátujeme tam. Pojmenujeme ji třeba time.html a uložíme do adresáře pro šablony (viz nastavování konstanty  TEMPLATE_DIRS):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Ahoj, světe!</title>
</head>
<body>
<h1>Aktuální čas</h1>
<p>{{ current_time|time:'H:i:s' }}</p>
</body>
</html>

Jak můžeme vidět, šablona se příliš neliší od obyčejné HTML stránky, jenom část {{ current_time|time:'H:i:s' }} je poněkud nestandardní. Zápis {{ var }} označuje místo, kde se má vypsat proměnná. Část za svislítkem je filtr time, který naformátuje náš čas podle zadaných kritérií. (Všimněte si, že se použité formátovače liší od těch v metodě strftime.)

Dále musíme upravit náš pohled tak, aby pracoval se šablonou:

from datetime import datetime
from django.shortcuts import render_to_response

def current_time(request):
    return render_to_response('time.html', {'current_time': datetime.now()})

Django obsahuje velké množství funkcí, které nám ulehčují život, a render_to_response je jedna z nich. Místo toho, abychom museli načíst soubor se šablonou, zpracovat jej a vrátit odpověď, stačí nám pouze poskytnout název souboru s šablonou a proměnné, které do ní pošleme, víc nic. Ty se zadávají v pythonovém slovníku, kde klíče označují název proměnné. Pokud bychom jich chtěli zadat víc, stačí je v tom slovníku oddělit čárkou.

Django URL

Zprovoznění statických souborů

Poslední věc, kterou si dnes ukážeme, je přístup ke statickým souborům. Bude se to hodit, až budeme chtít aplikace přizpůsobovat. Mezi statické soubory patří veškerý obsah, který chceme poslat klientovi bez předchozího zpracování na serverové straně — typicky obrázky, kaskádové styly a klientské skripty. Následující kód je potřeba vložit na úplný konec souboru urls.py:

from django.conf import settings

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^%s(?P<path>.*)$' % settings.MEDIA_URL[1:], 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
    )

Místo vysvětlování principu si pouze otestujeme funkčnost. Když do našeho adresáře se statickými soubory nahrajeme nějaký soubor, třeba PNG obrázek s názvem test.png, měli bychom na adrese http://127.0.0.1 :8000/static/tes­t.png tento obrázek vidět. Tento postup je určen pouze pro vývojové účely, z výkonnostních důvodů se při „ostrém“ provozu statické soubory většinou nechávají posílat přímo webserverem (např. z jiné domény).

Související odkazy

Příště se podíváme na databázový model a začneme stavět složitější aplikaci.

Komentáře

Subscribe
Upozornit na
guest
12 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Dundee5

Neměl by být ten komentář vypadat takto?

# –– coding: utf-8 –

Dundee5

Fórum asi filtruje hvězdičky, tak tedy znovu:

# -*- coding: utf-8 -*-

Dundee5

Ještě drobnost:

Django mi při použití kódu šablony z ukázky vyhodí parse error. Když se místo apostrofů ve filtru použijí uvozovky, funguje to v pořádku.

{{ current_time|time:"H:i:s" }}

Lisicky

V souboru settings.py jsme nechali TIME_ZONE = ‚America/Chicago‘. Je třeba to opravit na naše:
TIME_ZONE = 'Europe/Prague'

Milan

Absolutní cesty nejsou zrovna dobrý nápad.

Nefunguje něco takového?

cp=os.getcwd()
MEDIA_ROOT = cp+‚/static/‘

myneur
myneur

Jaká máte oblíbená vývojový prostředí?
Pracuje někdo stylem Test Driven Development? S čim?

dojob

Preklep vo vzorovom zapise premennych v subore „settings.py“ je zrejmy z kontextu a preto by nemal byt problem tento zapis vykonat korektne, ale pre istotu. ;)

MEDIA_ROOT = “
MEDIA_URL = “
STATIC_ROOT = ‚C:/Users/../hra­jeme_si/static/‘
STATIC_URL = ‚/static/‘

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.