utorak, 16 aprila, 2024
Sam svoj majstor

CherryPy okruženje za veb razvoj

Autor: Romeo Mlinar

U današnjem svetu web-a cene hostinga su sve povoljnije, a mogućnosti za razvoj brojnije. Za uobičajene vrste sajtova, poput bloga, e-trgovine ili prezentacije, postoji mnogo gotovih rešenja. Međutim, ukoliko se odlučite da napravite namenski projekat, verovatno ga nećete pisati „od nule“, već ćete odabrati jedan od brojnih framework-a, odnosno okruženja za razvoj. Ovaj tekst ukratko opisuje, uz minimalne primere, jedno takvo okruženje – CherryPy (CP).

CherryPy je framework stvoren u programskom jeziku Python, a isti jezik koristi se i za pisanje web programa (sajtova) u ovom okruženju. Reč je o objektno-orjentisanom sistemu za brzi razvoj, uz relativno visoku izloženost low-level elementima HTTP protokola. Ovo je jedna od značajnijih razlika između CP-a i sličnih minimalističkih webdev okruženja.

CP sajtovi pokreću se kao samostalni programi na serveru, na određenom portu. Okruženje sadrži sopstveni server, implementiran u Python-u, tako da je sajt odmah spreman za rad. Međutim, mnogi sajtovi CP pokreću u kombinaciji sa Nginx serverom: ovako podešen CP program radi u pozadini na serveru prihvatajući samo lokalne zahteve koji stižu posredno (proxy) preko Nginx-a.

Prikazaćemo kako napraviti jednostavan web program u CP-u. Mi smo koristili okruženje za Python 3, instalirano putem distribute modula.

Ovo je primer preuzet sa zvaničnog sajta. Kôd pokazuje model rada CP-a. Program, odnosno sajt, sadržan je u glavnoj klasi HelloWorld. Metodi klase dostupni su preko URL-a ali samo ako su eksplicitno podešeni kao „izloženi“ (ovde: index.exposed = True). Ukoliko sačuvamo primer i pokrenemo ga u konzoli pomoću komande python3 primer.py, možemo učitati stranicu sa servera u lokalu, na adresi: http://localhost:8080.

CP jednostavno prenosi adresu iz pregledača na metode klase. Pogledajmo drugi primer u kojem smo dodali stranicu „page“ (zapravo, „mapirali“ smo deo adrese na dinamički zahtevan sadržaj – rezultat zahteva stranice „page“ može se nalaziti bilo gde). Iz definicije metoda vidimo da prihvata argument pagetitle koji CP automatski ubacuje na osnovu adrese. Tako će http://localhost:8080/page/one parsirati stranicu sa tekstom „You just loaded page one!“. Međutim, ako zatražimo od servera stranicu sa adrese http://localhost:8080/page/one/foo dobićemo poruku da stranica nije nađena (greška 401). Ukoliko je CP podešen da prikazuje greške (standardno podešavanje u toku razvoja programa), videćemo da Python prijavljuje „pucanje“ u metodu .page, zahtevajući prisustvo samo jednog argumenta (pagetitle).

CP je relativno jednostavno okruženje za web razvoj tako da je na programeru odluka kako da implementira mehanizam za šablone (templating engine), keširanje, statičke datoteke ili RSS dovode na svom sajtu. Neka od rešenja koje CP koristi nalaze se u Python bibliotekama, poput cookie modula.

U gotovom sajtu imali bismo konfiguracijsku datoteku sa raznim parametrima koji detaljnije podešavaju rad servera. Na primer, mogli bismo promeniti port na kojem aplikacija očekuje zahteve, uključiti posrednički način rada (proxy) i tako dobijati ispravna zaglavlja od glavnog, izloženog servera (frontend). Ista datoteka sadržala bi i listu statičkih datoteka ili posebno definisano MIME zaglavlje. Uz sve to, čitav sajt bi se mogao pokretati u daemon režimu, umesto test primera iz konzole koji koristimo u ovom tekstu.

Iz ovoga vidimo da je razvoj u CherryPy jednostavan i direktan. Međutim, zbog odsustva većih celina koje imaju druga okruženja (cache, template, session management …) programe u ovom okruženju treba pažljivo osmisliti, pa tako verujemo da će ovaj framework odgovarati programerima koji traže veliku fleksibilnost u razvoju. Naravno, pogodan je i svim početnicima kao uvod u web razvoj, koji će posle umeti da cene sve prednosti koje nude, na primer, Django ili Pyramid.

U jednom od narednih tekstova nadovezaćemo se na ovaj tekst i pokazati kako se koriste Jinja2 šabloni.

Korisni linkovi:

[1] http://www.cherrypy.org/
[2] http://pypi.python.org/pypi/distribute/