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ů)

  1. Úvod do webového frameworku web.py 14.11.2013
  2. web.py – první aplikace 22.11.2013
  3. web.py – šablonovací systém 9.12.2013
  4. web.py – databáze 27.12.2013
  5. web.py – autentizace a autorizace 1.9.2014

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.

Absolvent gymnázia a budoucí student FI MUNI se zájmem o programování, Linux, hudbu, elektroniku, umění a černobílou analogovou fotografii. Začal jsem u modrého Dosu, přešel přes C#, Javu a nyní se věnuji hlavně Pythonu, mimo jiné i jako stážista v Red Hatu.

Zatím nebyl přidán žádný komentář, buďte první!

Přidat komentář
Zdroj: https://www.zdrojak.cz/?p=10378