Portál AbcLinuxu, 1. května 2025 04:54
Je to už asi 8 let a kousek co se hrabu ve webech. Můj první web byl časopis a měl jsem ambice ho poslat do Levelu kde se tyhle časopisy rozmáhali. Nedošlo k tomu a dneska jsem za to i rád:) Co chci říct je, že za těch 8 let jsem se vypracoval, i když si myslim že většinu toho co umím umím díky poslednímu roku s Linuxem.
Po zmateném úvodu zkusím v novém zmateném odstavci naznačit pointu. Ve třinácti jsem dělal statické weby, ve 14 dynamické pomocí PHP. V 15 se do toho namíchali databáze, v 16 jsem se objevoval a poznával divy C/C++, které mě nakonec moc nechytlo i když bych v tom aplikaci napsal. Byla to taky doba kdy jsem poprvé instaloval Linux a poprvé ho odmít. V 17 jsem parazitoval na svých znalostech a pokusil se něco vytvořitl. V 18 jsem podruhé poznal Linux a tentokrát ho neodmít, běžel jako druhý a rozchodil jsem v něm všechen HW, byl to Slackware. V 19 jsem poznal Python a přešel na Linux jako na hlavní systém. Na disku zůstala partition s nefunkčními Win. Během měsíce win šli do kopru a já prohluboval znalosti unixových systémů, různých knihoven a hlavně jsem se naučil pracovat s qt3/qt4. Před 20. narozeninami jsem udělal svoje poslední 4 velké projekty v PHP. Vyvíjel jsem u toho svůj php framework Form. Už se dostávám k cíly tak to dám do dalšího odstavce.
Začátky generování
Form byl bezvadný pomocník, práci na 3 hodiny mi zkrátil na 10 minut. Vývoj ale nešel najednou a každým projektem jsem přidal novou vrstvu. Nakonec jsem napsal 20 řádků kde jsem popsal co chci a vygenerovalo mi to formulář pro úpravu a list. Generovalo to jenom administraci, ale s webem mi to hodně pomáhalo. Nebylo to ono, a tak jsem se rozhodl přidat poslední vrstvu. Vrstvu která bude generovat úplně celou administraci. Narazil jsem na problém. Člověk pro kterého jsem tenkrát dělal z tohohle nebyl nadšený. Vývoj webu jsem zkrátil na pár dní. Jenže si to vybralo daň u prvních testů kde když odešlo něco ve frameworku tak nešla celá administace. Chvilku to dalo než se to odladilo, každej projekt přinášel nové vrstvy (celkově byli 3) a ladit to bylo čím dál horší. Vrstvování je pěkné, ale tak maximálně na postupný vývoj na novou aplikaci se to nehodí. Kdyby tenkrát tenhle člověk měl trochu trpělivosti a nevadilo mu, že tam občas něco drhne asi to dělám do teď, ale díky tomuhle jsem přestal na Form pracovat a chvilku zevloval.
pyweb?
Na konci minulého roku mě napadla myšlenka. Vybodnout se na vrstvování a začít s úplně novým návrhem a napsat to v jazyce, který dokáže líp pracovat s objekty. Výsledek je pyweb. O co jde. Rozdělil jsem web na elementární části, které se skládají do sebe. Výsledkem je modulární toolkit, který jde krásně využít k poskládání dynamického webu nezávislého na grafice aniž by člověk napsal jedinou řádku (X)HTML. Zrušil jsem tedy neosvědčené vrstvení a tentokrát skládám kousky, které se o sebe starají sami. Výhodou je, že se to dá skládat růčo přímo v Pythonu (jazyk co jsem nakonec vybral) a nebo použít konfigurační yaml soubůrky a napsat tam co vlastně chci. Stejně tak pěkně se to dá i generovat pomocí nějakého WYSIWYG nástroje, ale o tom dále.
Nová cesta k webu?
Popisuju tady hrušku, ale zatím jsem se nezmínil co z ní vyleze za červa. Největším problémem mojí práce bylo nesmyslné opakování kódu. Pyweb je navržen tak že generuje celé weby. Napíšeme form("konfigurak") a vyflushne nám to formulář, vytvoří tabulku v databázi a udělá list uložených dat. Tohle odebere asi 80% práce, ale umí to mnohem víc. Pyweb nevygeneruje jen celou administraci, ale dokáže vygenerovat celý web včetně detailu položek v DB, různých statistik, menu, layoutu, atd. Jak to přibližně funguje nastíním dále.
Yaml vítězem
Pokud něco můžu zneužít tak to zneužiju a ve světě OSS to platí dvojnásob. Jelikož pyweb nakonec OSS bude, tak se nemusím bát po něm přejímat kód nebo vužívat různé cool nástroje. Yaml je jedním z nich. Yaml soubor je soubor, který se dá přečíst dobře jak člověkem tak strojem a je implementován v každém druhém jazyku. Založil jsem tedy pyweb na něm. Musím podotknout, že mě k tomu nakop Botanicus. O Yamlu se dá dočíst třeba tady.
Základem je formulář
Ač se to nezdá, dnešní webový svět je založen na formuláři, je to to co dá nejvíce práce. Proto je to hlavní nosná síla pywebu. Funguje to asi tak, že se napíše jeden yaml soubor s určitými daty se kterým pracuje pár dalších objektů. Jeden vygeneruje formulář pro zadávání a stará se o zadávání. Druhý vygeneruje tabulku s daty a tlačítky pro úpravu atp. Další vygeneruje statisitku (fajn pro ankety třeba). Další zase vypíše detail jedné položky případně k ní zobrazí i nějaké ty uploadované fotky a další kravinky. S tímhle si už člověk v pohodě vystačí a poskládá s tim web, který vyhovuje většině zadání. Díky tomuto totiž jde udělat yaml soubor, který definuje formulář pro článek, novinky, zprávy z čehokoli, prostě cokli kde je potřeba něco zadat.
Na webu je i text
Text je takovym velkym trnem v mém oku. Já sice vyvíjím pyweb, ale kolega Botanicus pracuje na WYSIWYG nástroji pro konfigurační yamly. Jazyk pro text je něco co musíme odsouhlasit oba a i když pyweb podporuje teď 2 jazyky a jeden je připraven pro implementaci, tak defaultně buden nastaven jeden. Botanicus je TeXař a já jsem spíš user, tak se nemůžeme shodnout na jedné základní věci. Nový řádek chci mít jako :n a on jako ---. Tabulku chci mít jako :table:XXX a on jako ---table:XXX---. Obrázek to samý v bledě modrym. Udělali jsme nakonec kompromis, který není nejlepší a myslím že to bude dělat problémy :(
Layouty
Moderní web jede na CSS layoutech. Rychleji se to kreslí, hůř se to dělá. V pywebu znamená layout něco trochu jiného než sada divů. Je to rozložení prvků na stránce. Jsou to takové boxíky, které dum8d0g nazval cubes do kterých se dají vkládat jednotlivě objekty (formy, listy, články, anekty, ...). Pyweb tak má nástroje, které přečtou layout a nahází do toho objekty, které obsahuje a web je hotov.
2CSS stačí
Pyweb na celý web potřebuje 2 CSSka, jedno nastavuje jak má vypadat layout a druhé barvičky. Jelikož je pyweb složen z elementárních objektů tak můžu jednoduše nastavit barvy pro celý web a vím že to bude vypadat stejně a žádnej kód nebude duplicitní. CSSko pro layout se nestará o barvy ale o rozměry jednotlivých cubes případně jejich pozadí.
Pouze balíček
Inspiroval jsem se unixovým světem a navrhnul tar.bz2 archiv, který obsahuje všechno co je potřeba pro grafickou podobu webu. Výsledek je takový, že udělám jenom seznam objektů, které potřebuji na webu, vyberu balíček a mám web hotový. Balíček tedy obsahuje zmíněná 2CSSka, jeden layout a obrázky, které jsou nutné pro design webu. Když je tedy potřeba změnit grafika tak se změní jen balíček a všechno ostatní zůstává. Easy... :)
DOCS
S takhle velkým projektem přišli i problémy s dokumentací. Potřeboval jsem aspoň něco jednoduchého a nejlíp možnost získat další potřebná data. Začal jsem tedy s vývojem pydocs. Je to malý skriptík co prolítne py soubor, vyseká z něj třídy, metody a funkce, dá je do souvislosti a přiřadí k nim komentáře začínající na #?(popisek metody,fce nebo třídy) a ##?(popisek na úvodu). Výstup je do normálních textových souborů a je to bez práce a pohodlný :)
Konec
Už píšu hodinu a nic moc mě nenapadá tak když tak pokračování příště, protože tohle rozhodně neni konec. Komplet pyweb bude OSS a bude k dispozici do pár týdnů. Jestli bude i WYSIWYG generátor yamlíků OSS nevím, ale Botanicus se určitě ozve v diskusi. Zatím se loučím a doufám, že to nebylo moc dlouhý :)
Tiskni
Sdílej:
cx@desktop:~/python/pyweb$ ./count.sh 218 dataForm.py 238 dataTable.py 36 div.py 215 files.py 306 form.py 26 io.py 119 imgs.py 50 listing.py 15 pywebgen.py 118 pyweb.py 365 sql.py 120 table.py 200 webgen.py 69 xhtml.py 75 menu.py 61 pysys.py 120 text.py 154 docs.py 2505 celkem
Ty myslíš na úrovni toho generátoru? No těch pár značek je namíchanejch v metodách gen() v každym objektu co něco vyflushává. Ono jich zas tolik neni, takže nemá smysl to oddělovat.
Teď nevím jestli si mě pochopil. Generátor negeneruje celý web, ale jenom část, která je zrovna vyžadovaná. Tedy vrací pouze jednu XHTML stránku. Ke zpracování dat z apache používám handler.
(define hello-template (lambda (jmeno) `(html (body (h1 "Hello world") (p ,jmeno)))) (define (hello-controler (request template) (let ((jmeno (get-name request))) ....... some other logic ....... (template jmeno)) (hello-controler request hello-template)
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.