web.py – první aplikace

V dnešním díle seriálu již přejdeme k instalaci prostředí a tvorbě webové aplikace. Skrze ukázky kódu se budeme věnovat konfiguraci, zpracování URL i testování. Nakonec si vytvoříme ukázkovou aplikaci, na které nabyté znalosti patřičně využijeme.
Seriál: Webový framework web.py (5 dílů)
- Úvod do webového frameworku web.py 14. 11. 2013
- web.py – první aplikace 22. 11. 2013
- web.py – šablonovací systém 9. 12. 2013
- web.py – databáze 27. 12. 2013
- web.py – autentizace a autorizace 1. 9. 2014
Nálepky:
V minulém díle jsme se zakousli do teorie webového frameworku web.py, dnes už od teorie přesoupíme k praxi a budeme se věnovat tvorbě webové aplikace. Začněme tedy instalací samotného Pythonu.
Instalace Pythonu
Pro použití web.py je samozřejmě nutné mít nainstalovaný Python. Ten je aktuálně ve dvou stabilních verzích 2.7.6 a 3.3.2, přičemž pro obě existuje balíček web.py. My budeme používat verzi 2.7, na které je postavena hlavní větev web.py.
Instalační soubory naleznete na stránkách Pythonu http://www.python.org/getit/. Pro Windows je zde klasický instalátor, uživatelé Linuxu si se stahováním instalátorů nemusí lámat hlavu, většina distribucí má totiž Python obsažen v základní instalaci (pokud ne, lze jej získat ze stránek Pythonu či z repozitářů distribuce).
Po dokončení instalace budete mít k dipozici aplikaci Python IDLE, ta obsahuje příkazový řádek i vývojové prostředí pro editaci a spouštění scriptů.
Instalace web.py
Balíček web.py je možné nainstalovat rovnou do složek Pythonu, to ale z hlediska budoucí distribuce aplikace nelze doporučit. Nejjednodušší možností je celou knihovnu stáhnout z oficiální adresy http://webpy.org/static/web.py-0.37.tar.gz a její složku web vložit do adresáře aplikace.
Pozn.: Problémy týkající se distribuce aplikace pomáhají řešit nástroje jako virtenv či setuptools, těmi se ale v našem seriálu zabývat nebudeme.
Adresářová struktura
Jak již bylo v minulém díle řečeno, nic zde není pevně dáno, to se týká i adresářové struktury. Zde je návrh možné struktury aplikace vycházející z jejích základních potřeb:
Aplikace ├── aplikace ├── web ├── static ├── templates └── main.py
Složka aplikace bude obsahovat vytvořené moduly Pythonu, web obsahuje framework web.py, static obsahuje statické soubory, templates obsahuje šablony stránek a main.py je hlavním řídícím kódem aplikace. Dle potřeby je možné přidat i složky jako logs, scripts apod.
Samotná aplikace
Jádrem web.py aplikace je jeden nebo více souborů, které se starají o základní konfiguraci, přiřazování adres a servírování stránek. V modelu MVC by tedy tyto soubory zastávaly roli kontrolerů.
Konfigurace
V hlavním souboru web.py aplikace se obvykle provádí konfigurace databází, sessions, vykreslování šablon, globální proměnných a konečně i testovacího serveru.
Zde je ukázka, jak takový kód může vypadat:
import web
///////////////////
// mapování urls //
///////////////////
app = web.application(urls, globals())
render = web.template.render('templates/', base='base')
session = web.session.Session(app, store = web.session.DiskStore('sessions'))
//////////////////////
// jednotlivé třídy //
//////////////////////
if __name__ == "__main__":
app.run()
V kódu se nachází import modulu web, vytvoření aplikace, vytvoření renderu šablon (předáváme složku obsahující šablony a případně i základní šablonu a globální proměnné), nastavení sessions (s ukladáním do složky sessions), nakonec přidáme kód pro nastartování vývojového serveru při spuštění kódu.
URL handling
Pro párování adres s jednotlivými třídami slouží množina Pythonu, ta může vypadat například takto:
urls = (
'/':'Index',
'/retezec/(.+)':'ZpracujVstup',
'/cislo':'UmocniVstup',
'/cislo/(\d+)':'UmocniVstup'
)
Jak vidíte, v množině se nachází páry složené z URL a názvů tříd, které mají requesty na daných adresách zpracovávat, jedné třídě lze přitom přiřadit i více adres. U druhé a čtvrté adresy si všimněte použití regulárních výrazů (v prvním případě pro libovolnou hodnotu, ve druhém pro číselnou) sloužících pro vložení argumentů, díky tomu se můžeme vyhnout konstrukcím jako /retezec?vstup=vstupuživatele.
Jak bylo vidět v předchozím kódu, množina urls je předána při tvorbě objektu app.
Zpracování
Když přijde do aplikace HTTP request, framework se jej pokusí na základě URL přeposlat k určené třídě. Tyto třídy mohou obsahovat metody GET a POST (ta správná se vybere dle metody requestu). Zde je příklad obou metod:
class UmocniVstup():
# krom parametru self předáme i parametr cislo, který
# vyjadřuje hodnotu předanou v regexu '/umocni/(d+)'
GET(self, cislo):
return cislo * cislo
POST(self):
# parametry předávané metodou post můžeme získat
# pomocí web.input().nazev_vstupu
cislo = web.input().cislo
return cislo * cislo
Po vykonání všech akcí metody většinou dochází k zaslání HTTP response obsahujícího stránku, data či HTTP hlášení, zde jsou vypsány některé z možností:
return "Ahoj" # vrací řetězec
return render.uvod # vykreslí šablonu uvod.html
return web.seeother("/") # přesměruje s hlášením 303 na jinou stránku
return web.notfound("Stránka nebyla nalezena") # vrátí hlášení 404 s textem
return web.notfound(render.nenalezeno()) # vrátí hlášení 404 reprezentované danou šablonou
Další metody HTTP hlášení naleznete v dokumentaci http://webpy.org/docs/0.3/api#web.webapi.
Ukázka a spuštění aplikace
Následuje kód ukázkové aplikace, myslím, že není třeba nic vysvětlovat:
# -*- coding=utf-8 -*-
import web
urls = (
'/','Uvod',
'/umocni/(\d+)', 'Umocni',
)
app = web.application(urls, globals())
class Uvod:
def GET(self):
return "Ahoj"
class Umocni:
def GET(self, cislo):
return int(cislo) * int(cislo)
if __name__ == "__main__":
app.run()
Kód uložte do souboru main.py, nezapomeňte do stejného adresáře vložit i balíček web.py web. Na Windows pak stačí soubor otevřít pomocí Pythonu. Na Linuxu můžete soubor spustit zavoláním příkazu python ./main.py
. Po spuštění serveru přejděte do prohlížece na adresu http://localhost:8080 a poté http://localhost:8080/umocni/2.
Aplikace má standardně spuštěný mód debugování, díky tomu se všechny změny na zdrojovém kódu okamžitě projevují na běžící aplikaci. Pokud navíc nastane v kódu nějaká chyba, její podrobný popis se vypíše v okně prohlížeče. Tyto funkce jsou v „ostrém“ provozu z bezpečnostních důvodů nežádoucí, je tedy nutné mód debugování vypnout přidáním kódu web.config.debug = False
pod importy knihoven.
Závěr
To je k dnešnímu dílu vše. Příště se budeme věnovat šablonám, které dnes už byly několikrát zmíněny. Povíme si něco o jejich systému, proměnných, cyklech, podmínkách i metodách.
Kód uložte do souboru main.py, nezapomeňte do stejného adresáře vložit i balíček web.py.