Tutoriál: vyvíjame AudioAgregator - diel I. - TurboGears

Z každej strany sa na nás valí veľké množstvo nových zaujímavých technológií. Možno ste si hovorili, že by bolo dobré nejakú z nich vyskúšať, ale nenašli ste si čas. Poďme sa pozrieť ako je možné prepojiť niektoré z nich do spolupracujúceho celku a vytvoriť zaujímavú fungujúcu aplikáciu. Pokúsime sa vybudovať Audio agregátor s použitím technológií Plone CMS, TurboGears a Flex. Na komunikáciu použijeme JSON. Položme teraz základný kameň tejto skladačky.

Máme internetový portál postavený na Plone, do ktorého chceme pridať stránku obsahujúcu Flexovú aplikáciu Audio agregátor. Aplikácia má zobrazovať zoznam audia, napríklad záznamov z firemných porád a umožniť tieto mp3 súbory prehrať. Zoznam bude získaný z druhého portálu postaveného na TurboGears, ktorý slúži na ukladanie dát a manipuláciu so záznamami.

V skratke sa pozrime na technológie, ktoré chceme prepojiť. Plone je vyspelý open source systém. Používa sa na publikovanie dokumentov, vytváranie internetových a firemných portálov. Má prepracovaný systém pluginov tzv. Products, podporuje workflow, sledovanie zmien dokumentov a má veľa ďalších pekných vlastností.

Adobe Flex je framework slúžiaci na budovanie RIA aplikácií (Rich Internet Application). Flex posúva možnosti internetových aplikácii o úroveň ďalej. Ako vývojársky jazyk sa používa ActionScript3 kombinujúcom v sebe vynikajúce vlastnosti, ktorých pôvod môžeme môžeme vystopovať v jazykoch ako Ruby, Python alebo Java.

TurboGears je framework napísaný v jazyku Python a svoju popularitu získal vďaka jednoduchosti akou je možné vytvárať web aplikácie s použitím databáz ako napríklad Sqlite alebo PostgresSQL.

Veľa nových mien a máloktoré vám niečo hovorí? Pustíme sa preto do stavby aplikácie, aby sme sa mohli na príkladoch naučiť, čo jednotlivé mená znamenajú. Pre jednoduchosť rozdelíme prácu do samostatných krokov.

1. vytvoríme TurboGear aplikáciu AudioServer
2. vytvoríme Flex aplikáciu AudioAgregator
3. vytvoríme PloneAgregator plugin pre Plone
4. úprava komponent na prehrávanie súborov

Budeme vyvíjať aplikácie na operačnom systéme Windows XP. Vývoj by rovnako dobre fungoval samozrejme aj na Linuxe, Macu alebo BSD. Jednotlivé kroky podrobne prejdeme, aby sme mali k dispozícii všetky informácie a nástroje potrebné na vybudovanie aplikácie. Zdržíme sa chvíľku pri inštalácii a to z toho dôvodu, že nie všetky kroky sú úplne priamočiare.

Nainštalujeme si TurboGears, k jeho prevádzke budeme potrebovať jazyk Python. Pre naše potreby použijeme Python 2.4. Budeme sa pridržiavať anglického návodu.
Stiahneme si a spustíme inštalátor Pythonu 2.4. Necháme Python nainštalovať do „C:\Python24“. Nastavíme systémovú premennú PATH, aby sme mohli rýchlo spúšťať príkazy a podporné skripty. Pravé tlačidlo myši na „Tento počítač“ - Vlastnosti - Systémové nastavenia - Rozšírené - Premenné prostredia upraviť alebo pridať premennú PATH. Pridajme „C:\Python24;C:\Python24\Scripts“. Odteraz budeme môcť zavolať skripty priamo z príkazového riadku.

Nebojme sa príkazového riadku. Jeho použitie bude jednoduché a prinesie nám veľa výhod.

Pristúpme k samotnej inštalácii frameworku TurboGears. Stiahnime si skript tgsetup.py do adresára „C:\projekty“. Tento skript obsahuje inštrukcie na kompletnú inštaláciu TurboGears. Framework totiž pozostáva z rôznych komponent, ktoré sú
poskladané z navzájom nezávislých open source projektov ako napríklad HTTP framework CherryPy alebo JavaScriptový kit MochiKit.

Spustíme si príkazový riadok. Zadáme príkazy vedúce k inštalácii:

    cd C:\projekty
    python tgsetup.py
    

Skript nejakú chvíľu pobeží a nainštaluje potrebné komponenty. Úspech inštalácie overíme príkazom: „tg-admin info“. Pokiaľ sme úspešne zvládli inštaláciu môžeme postúpiť na ďalší level.

Tu odporúčam venovať 20 minút času pozretiu video tutoriálu 20 Minute Wiki Tutorial, ktorého prepis nájde aj v textovej podobe. Tutoriál si pozrite aj v prípade, že nerozumiete angličtine, aby ste pochytili základné grify ako s TurboGears pracovať.

Údaje v aplikácii budeme ukladať do Sqlite databázi. Na prevádzkovanie Sqlite nie je nutné mať spustený žiadny databázový server. Dáta sú ukladané do jedného súboru. Doinštalujme do nášho Pythonu ešte modul pre Sqlite a pridajme aj Docutils, čo je sada nástrojov pre prácu s reťazcami a formátovaním. Zadajme preto do príkazového riadku:

    easy_install pysqlite
    easy_install docutils
    

Poďme vytvoriť samotnú aplikáciu. Najskôr necháme TurboGears vygenerovať pre nás kostru aplikácie. Z príkazového riadku spustíme generovanie projektu:

    cd C:\projekty
    tg-admin quickstart
    

Ako meno projektu zadajme: AudioServer. Ako packagename zadajme: audioserver. Na otázku či potrebujeme podporu pre identifikáciu používateľov (Identity) odpovedzme: yes. Hodí sa nám. Po odklepnutí poslednej odpovede sa na obrazovke objaví množstvo informácií súvisiacich s vygenerovaním aplikácie.

Skúsme, či kostra aplikácie je funkčná. Zadajme:

    cd AudioServer
    python start-audioserver.py
    

Ak je všetko správne CherryPy nám povie, že server pracuje na porte 8080. Skúsme preto overiť fungovanie zadaním URL do web prehliadača: http://localhost:8080. Server zastavíme stlačením CTRL+C v okne s príkazovým riadkom.

Ďalej potrebujeme, aby AudioServer si pamätal informácie o tom, aké audio súbory má k dispozícii. Vytvoríme triedu (class), na základe ktorej TurboGears vytvorí a sprístupní databázu. Čo všetko by sme potrebovali o audio súbore evidovať? Kedy bol do systému zanesený, jeho URL, titul, popis. Otvorme si v editore súbor „audioserver\model.py“. (Pozn. autora: Na tento účel môžete využiť Eclipse s PyDev pluginom) Na začiatok súbory pod importy vložme kód:

    class AudioRecord(SQLObject):
        created = DateTimeCol(default=datetime.now)
        url = UnipreCol(length=255)
        title = UnipreCol(length=64)
        description = UnipreCol(length=255)
    

Po definícii modelu necháme TurboGears vygenerovať databázu príkazom:

    tg-admin sql create
    

Databáza bude uložená v súbore: devdata.sqlite. Na manipuláciu s databázou použijeme nástroj CatWalk. TurboGears prináša so sebou sadu nástrojov, ktoré spustíme príkazom:

    tg-admin toolbox
    

V Toolboxe pomocou CatWalku pridajme do tabuľky AudioRecord pár záznamov:

    url: /audio/test1.mp3
    title: Testovacia MP3 1
    description: Prvá MP3 na otestovanie fungovania prehrávača
    
    url: /audio/test2.mp3
    title: Testovacia MP3
    description: MP3 na otestovanie fungovania prehrávača
    

Výborne. Tým pádom máme informácie v databáze a TurboGears s nimi vie pracovať. Pridajme preto metódu, ktorá zobrazí informácie o obsahu databáze
v čitateľnej podobe. Do súboru „audioserver\contollers.py“ doplníme funkciu do triedy Root, ktorá má request spracovať. V prvom rade musíme povedať nášmu controlleru, aby si načítal informácie z modelu. To zaistíme
importom:

    from audioserver.model import AudioRecord
    

V rámci controlleru je k dispozícii definícia triedy AudioRecord a môžeme s ňou pracovať. Metóda, ktorá zobrazí informácie sa bude volať audiolist. Tu je kód:

    @expose(template="audioserver.templates.audiolist")
    def audiolist(self):
        audioRecords = AudioRecord.select(orderBy=AudioRecord.q.created)
        return dict(audioRecordList = audioRecords)
    

Tento kúsok kódu môže vyzerať magicky a až nepochopiteľne. Jeho logika je ale veľmi jednoduchá. „def audiolist(self)“ zadefinuje metódu audiolist. Jedná
o metódu triedy a self je výraz pre identifikáciu objektu. Na tento účel sa v iných jazykoch používa kľúčové slovo this. Výraz s audioRecords si rozoberme po kúskoch. Chceme načítať zoznam o audio záznamoch z databáze. Tabuľku nám popisuje trieda AudioRecord, ktorú sme si importovali. Časť výrazu „AudioRecord.select(orderBy=AudioRecord.q.created)“, znamená zavolanie statickej metódy select, pričom záznamy na výstupe tejto metódy budú
zotriedené podľa dátumu vytvorenia. Volanie „return dict(...)“ vráti slovník, kde jeho jednou položkou bude audioRecordList, v ktorej bude uložený zoznam, ktorý sme práve získali z databáze.

Prečo na konci robíme vytvorenie nejakého slovníku? Radi by sme zobrazili stránku v ktorej by sa nachádzal zoznam audio súborov. Je jasné, že return samotný stránku nevygeneruje. Na tento účel použijeme v Pythone konštrukt dekorátor a konkrétne dekorátor expose z TurboGears. Dekorátor sa značí v Pythone znakom @ na začiatku výrazu. Všimnime si, že ako parameter pre expose uvádzame nejakú šablónu. Tú sme ale doposiaľ nevytvorili. Preto pridajme súbor „audioserver\templates\audiolist.kid“:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
        py:extends="'master.kid'">
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
    <title>List of audio files</title>
    </head>
    <body>
        <ul>
            <li py:for="audioRecord in audioRecordList">
            <a href="${tg.url('/' + audioRecord.url)}"
                py:content="audioRecord.title">Titulok súboru</a>
            </li>
        </ul>  
    </body>
    </html>
    

Na vytváranie šablón sa používa šablónovací jazyk Kid. Po uložení šablóny môžeme naštartovať server. Pre úplnosť zopakujme si príkaz:

    python start-audioserver.py
    

A môžeme si pozrieť zoznam, ktorý sme zadali do databázy: http://localhost:8080/audiolist. Skvele!

Tak a teraz by sme radi dali k dispozícii výsledok funkcie audiolist svetu. Je jasné, že pokiaľ by mal niekto s našou metódou audiolist pracovať, tak by v pri súčasnej implementácii musel parsovať HTML. Čo by bolo veľmi nepraktické. Radi by sme preto sprístupnili výsledok prostredníctvom nejakého vhodného formátu. Použijeme JSON - JavaScript Object Notation. A spravíme to veľmi jednoducho, pridáme ďalší dekorátor, pred deklaráciu metódy audiolist:

    @expose("json")
    

Teraz už stačí len povedať v URL, že chceme odpoveď vo formáte JSON: http://localhost:8080/audiolist?tg_format=json

Výsledok:

    {"audioRecordList": [{"url": "\/audio\/test1.mp3", "descripti...." ...}]}
    

Úspešne sa nám podarilo vytvoriť aplikáciu v TurboGears, ktorá poskytuje do sveta funkciu audiolist. V ďalšom dieli tohoto seriálu sa pozrieme na to, ako napojiť Flexovú aplikáciu na náš server.

Implementáciu príkladu si môžete stiahnuť pomocou Subversion z adresy:
https://svn.asinus.org/projects/audioagregator/trunk/AudioServer/

Poznámka: na checkout údajov zo Subversion môžete použiť klienta TortoiseSVN alebo plugin do Eclipse zvaný Subclipse.


Reklama AdSense

Powered by Drupal - Design by artinet