[python] Sablony
Petr Prikryl
PrikrylP na skil.cz
Úterý Srpen 2 08:18:40 CEST 2005
Martin Blazik
> nedoporucil by mi nekdo nakej hezkej sablonovaci system pro webove
> aplikace? Nemyslim cely framework pro weby, ale jen a pouze
> HTML sablony [...]
Pokud to není na velké věci, pak možná stačí
využít vlastností formátovacího řetězce a dosazování
položek nachystaných ve slovníku takto:
1. Vyhradím si slovník, kde klíčem je zvolená zkratka
a hodnotou požadovaná hodnota (pro parametrizaci šablony).
2. Do souboru si připravím šablonu dokumentu a v místech,
kde se má něco dosazovat, uvedu například %(mujParametr)s.
3. Načtu soubor definující šablonu do řetězcové proměnné
-- bude to formátovací řetězec.
4. Do přes formátovací řetězec přepasíruji nachystaný
slovník a výsledkem je řetězec, který zapíšu do výstupního
souboru.
Je to sice triviální a v této podobě bez jakékoliv diagnostiky,
ale je to snadno pochopitelné a při minimálním úsilí asi
poměrně výkonné.
Není taky tak moc složité definovat si natvrdo šablonu
pro záhlaví dokumentu a pro ukončení dokumentu. Pro generování
jednotlivých prvků dokumentu si taky můžu definovat své
funkce/metody objektů.
Příklad:
Soubor p.py
=================================================
# -*- coding: cp1250 -*-
tpl_name = "sablona.tpl"
out_name = "vystup.html"
d = { 'title': 'Toto je titulek dokumentu',
'version': '3.0.1.256'
}
# Tady bude nějaký další kód...
d['poznamka'] = u'Toto je nějaká moje poznámka'
d['kun'] = u'Unicodový příšerně žluťoučký kůň, co úpěl ďábelské ódy.'
# Načteme šablonu.
f = file(tpl_name)
sablona = f.read()
f.close()
# Dosadíme do šablony a výsledek zapíšeme do výstupního souboru.
f = file(out_name, 'w')
f.write(sablona % d) # Dosazení slovníku do šablony.
f.close()
# Spustím prohlížeč na výsledek.
import webbrowser
webbrowser.open(out_name)
=================================================
Soubor sablona.tpl
=================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
<link rel="stylesheet" type="text/css" href="tutor.css" >
<link rel="stylesheet" type="text/css" href="colors.css" >
<title>%(title)s</title>
</head>
<body>
<h1>%(title)s -- použito podruhé</h1>
<table summary="důležitá tabulka">
<tr><td>Verze:</td><td>%(version)s</td></tr>
<tr><td>Jak je to s tím koněm?</td><td>%(kun)s</td></tr>
</table>
<p><b>Poznámka:</b> %(poznamka)s</p>
</body>
</html>
=================================================
pepr
P.S. V programování existuje taky dualita: program versus data.
Složitější logiku můžu zvládnout složitějším programem
nebo složitějšími datovými strukturami. Šablonové systémy
zjevně vkládají veškeré aplikační moudro do mocnějšího
dosazovacího aparátu, aby uživatel zvládl vše definicí dat.
V některých případech (a v Pythonu díky jeho stručnosti
a pružnosti zvláště) může být jednodušší napsat si svůj kousek kódu,
než studovat šablonový mechanismus, který napsal někdo jiný.
Je to věc posouzení potřeb, dostupných nástrojů, zvážení toho,
co budu potřebovat v blízké a vzdálenější budoucnosti (jestli se
vyplatí studovat nějaký složitější systém) a zvolení vhodných
kompromisů.
Další informace o konferenci Python